Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отправка файла через post, не удается нормально отправить картинку 
:(
    Опции темы
falling
Дата 7.1.2010, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 29.12.2008

Репутация: нет
Всего: нет



Искал что то похожее по всему интернету так и не нашел. Проблема следующая, пытаюсь отправить картинку через 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 ........'

На сервере она сохраняется естественно так же. Помогите исправить, второй день голову ломаю  smile 
PM MAIL   Вверх
Void
Дата 7.1.2010, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 10
Всего: 173



Судя по http.client, вы использует Python 3. Строки (str) там только юникодные, для бинарных данных есть тип bytes, который и читает read(). При форматировании вызывается метод bytes.__str__, который и возвращает приведённую строку. Запрос надо собирать в bytes.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
powerfox
Дата 7.1.2010, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 1
Всего: 97



Лучше использовать что-то специализированное (для форм): http://code.activestate.com/recipes/146306/


--------------------
user posted image
PM WWW   Вверх
falling
Дата 7.1.2010, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 29.12.2008

Репутация: нет
Всего: нет



Если можно поподробнее, собирать запрос в bytes...

попробовал так:
Код

    data = open("kartinka.jpg", 'rb').read()
    # разделитель для данных
    boundary = b'----------OmNaOmNaOmNamo'
    # тело HTTP-запроса
    body = b'''--%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()


результат:
Цитата

Traceback (most recent call last):
  File "C:/Python31/1.py", line 18, in <module>
    ''' % (boundary, boundary, boundary, data, boundary)
TypeError: unsupported operand type(s) for %: 'bytes' and 'tuple'


Добавлено через 2 минуты и 38 секунд
Смотрел несколько раз на http://code.activestate.com/recipes/146306/, но почему то не уверен что не возникнет такая же проблема 
PM MAIL   Вверх
Void
Дата 7.1.2010, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 10
Всего: 173



Цитата(falling @  7.1.2010,  21:11 Найти цитируемый пост)
Если можно поподробнее, собирать запрос в bytes...

Конкатенацией, форматирование не работает.
Цитата(falling @  7.1.2010,  21:11 Найти цитируемый пост)
Смотрел несколько раз на http://code.activestate.com/recipes/146306/, но почему то не уверен что не возникнет такая же проблема  

Там код для Python 2.x.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
falling
Дата 7.1.2010, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 29.12.2008

Репутация: нет
Всего: нет



Собрал вроде бы body в bytes, но вот проблема, есть поле key в котором содержится ключ, если отправлять запрос в bytes, то сервер возвращает ошибку указывая на то что ключ не верный, пробовал преобразовывать ключ из utf-8 в bytes с помощью key = bytes (key, "utf-8") не помогло, пытался перед отправкой преобразовать body в utf-8 с помощью  body = str(body, "utf-8"), результат: 
Цитата

UnicodeDecodeError: 'utf8' codec can't decode byte 0xff in position 304: unexpected code byte

PM MAIL   Вверх
falling
Дата 8.1.2010, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 29.12.2008

Репутация: нет
Всего: нет



Пытался указать для отправляемого файла: Content-Transfer-Encoding: binary, не помогло  smile 
PM MAIL   Вверх
falling
Дата 8.1.2010, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 29.12.2008

Репутация: нет
Всего: нет



 smile  smile  smile УРА! smile) Сделал, начал пробовать подряд все кодировки, помогло: 
Код

data = data.decode("unicode_escape")

всем спасибо
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0504 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.