Найти - Пользователи
Полная версия: Отправка файла через post, не удается нормально отправить картинку
Начало » Network » Отправка файла через post, не удается нормально отправить картинку
1
skyman
Искал что то похожее по всему интернету так и не нашел. Проблема следующая, пытаюсь отправить картинку через post запрос.

    data = open("kartinka.jpg", 'rb').read()
# разделитель для данных
boundary = '----------OmNaOmNaOmNamo'
# тело HTTP-запроса
body = '''--%s
Content-Disposition: form-data; name="method"
post
--%s
Content-Disposition: form-data; name="key"
213453243244
--%s
Content-Disposition: form-data; name="file"; filename="kartinka.jpg"
Content-Type: image/pjpeg
%s
--%s--
''' % (boundary, boundary, boundary, data, boundary)

# заголовки HTTP-запроса
headers = {'Content-type': 'multipart/form-data; boundary=%s' % boundary}
# подключение к HTTP-серверу
h = http.client.HTTPConnection('adress.com')
# посылка запроса
h.request("POST", "/in.php", body, headers)
# получение и анализ ответа HTTP-сервера
resp = h.getresponse()
data = resp.read()
h.close()
Картинка считывается и отправляется в следующем виде:
b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00\x01\x00\x01\x00\x00\xff\xfe\x00>CREATOR: gd-jpeg v1.0 ……..'
На сервере она сохраняется естественно так же. Помогите исправить, второй день голову ломаю :(
o7412369815963
я думаю не надо превращать данные в строку: “%s” % data,
может попробовать просто: body += data

а ещё я бы прочел бы пост-запрос от нормального браузера, посмотреть какой он должен быть нормальный.

и я думаю есть штатные средства для формирования post запроса, может cgi, он вроде разбирает пост запросы, может и собирать умеет
dimabest
skyman

Во-первых по стандарту все переводы строк должны быть ‘\r\n’, лучше указать их явно.
Во-вторых у тебя неверный формат данных - после boundary ‘\r\n’, после каждого заголовка ‘\r\n’, после последнего заголовка два ‘\r\n’, а не один - как у тебя.

--boundary\r\nContent-Disposition: form-data; name="file"; filename="kartinka.jpg"\r\nContent-Type: image/pjpeg\r\n\r\ndata\r\n--boundary\r\n
skyman
Видимо тег code убрал лишние переносы строк, с самим запросом все нормально, он передает все нужные поля в нужном виде. Посоветовали собрать весь запрос в bytes (_ttp://forum.vingrad.ru/forum/topic-286468/kw-post-%D1%84%D0%B0%D0%B9%D0%BB.html), или не получилось или не помогло…продолжаю думать
poltergeist
http://www.w3.org/TR/html401/interact/forms.html
Листайте в самый низ, последний пример - ваш (см. заголовок Content-Transfer-Encoding).
skyman
Не помогло, хотя впринципе должно было заработать ( сервер все равно сохраняет изображение в файл в следующем виде:
b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00\x01\x00\x01\x00\x00\xff\xfe\x00>CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), default quality…'
skyman
УРА!!! :) сделал, помогло:
data = data.decode("unicode_escape")
poltergeist
Это не верно, похоже на метод тыка… помогло - не помогло…

Можешь сделать print(repr(body)) сюда? И хорошо бы указывать версию питона заранее, если речь идёт о 3-м питоне.
poltergeist
Вот в чём проблема (возможно не единственная):
>>> '-- %s --' % b'test'
"-- b'test' --"
skyman
Это не верно, похоже на метод тыка… помогло - не помогло…
мб, но мне надо было отправить файл в таком виде в каком он хранится на диске, а питон его преобразовывал в bytes и отсылал так как ему хотелось, притом отсылал и вместе с буквой b перед началом переменной :)

Python 3.1.1

Можешь сделать print(repr(body)) сюда?
не получилось:
UnicodeEncodeError: ‘charmap’ codec can't encode characters in position 352-355: character maps to <undefined>
Вот в чём проблема (возможно не единственная):
не понял ( если ты про сам запрос то с ним все в порядке, тут просто его тег code немного отформатировал
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB