Форум сайта python.su
Искал что то похожее по всему интернету так и не нашел. Проблема следующая, пытаюсь отправить картинку через 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 ……..'На сервере она сохраняется естественно так же. Помогите исправить, второй день голову ломаю :(
Офлайн
я думаю не надо превращать данные в строку: “%s” % data,
может попробовать просто: body += data
а ещё я бы прочел бы пост-запрос от нормального браузера, посмотреть какой он должен быть нормальный.
и я думаю есть штатные средства для формирования post запроса, может cgi, он вроде разбирает пост запросы, может и собирать умеет
Отредактировано (Янв. 7, 2010 19:44:41)
Офлайн
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
Отредактировано (Янв. 7, 2010 22:02:40)
Офлайн
Видимо тег code убрал лишние переносы строк, с самим запросом все нормально, он передает все нужные поля в нужном виде. Посоветовали собрать весь запрос в bytes (_ttp://forum.vingrad.ru/forum/topic-286468/kw-post-%D1%84%D0%B0%D0%B9%D0%BB.html), или не получилось или не помогло…продолжаю думать
Офлайн
http://www.w3.org/TR/html401/interact/forms.html
Листайте в самый низ, последний пример - ваш (см. заголовок Content-Transfer-Encoding).
Офлайн
Не помогло, хотя впринципе должно было заработать ( сервер все равно сохраняет изображение в файл в следующем виде:
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…'
Офлайн
УРА!!! :) сделал, помогло:
data = data.decode("unicode_escape")
Офлайн
Это не верно, похоже на метод тыка… помогло - не помогло…
Можешь сделать print(repr(body)) сюда? И хорошо бы указывать версию питона заранее, если речь идёт о 3-м питоне.
Офлайн
Вот в чём проблема (возможно не единственная):
>>> '-- %s --' % b'test'
"-- b'test' --"
Отредактировано (Янв. 8, 2010 12:33:21)
Офлайн
Это не верно, похоже на метод тыка… помогло - не помогло…мб, но мне надо было отправить файл в таком виде в каком он хранится на диске, а питон его преобразовывал в bytes и отсылал так как ему хотелось, притом отсылал и вместе с буквой b перед началом переменной :)
Можешь сделать print(repr(body)) сюда?не получилось:
UnicodeEncodeError: ‘charmap’ codec can't encode characters in position 352-355: character maps to <undefined>
Вот в чём проблема (возможно не единственная):не понял ( если ты про сам запрос то с ним все в порядке, тут просто его тег code немного отформатировал
Офлайн