Найти - Пользователи
Полная версия: не могу отправить файл с помощью urllib
Начало » Python для новичков » не могу отправить файл с помощью urllib
1 2
Игнат
задача простая - отправить ПОСТ-запрос, ссылающийся на бинарный файл, так чтобы файл был отправлен на сервер
multipart/form-data

пока получилось это сделать только для питона 2.7 с библиотекой poster
http://pypi.python.org/pypi/poster/

но мне надо для питона 3.2

в постере есть какой-то хитрый класс multipart_yielder, который возвращает итератор
<poster.encode.multipart_yielder object at 0x930cf4c>

этот итератор можно передать в request urllib-а:
datagen, headers = multipart_encode({"image1": open("image.png", "rb")})
response = opener.open(request, datagen, headers)
разобраться в нем и сделать свой итератор пока не представляется возможным, поэтому попробовал тупо запустить этот код на питоне 3.2
исправил кучу ошибок, но последнюю не знаю как исправить:

Traceback (most recent call last):
File "/home/tmp/poster-0.8.0/test.py", line 20, in <module>
response = opener.open(request, datagen, headers)
File "/usr/local/lib/python3.2/urllib/request.py", line 366, in open
response = self._open(req, data)
File "/usr/local/lib/python3.2/urllib/request.py", line 384, in _open
'_open', req)
File "/usr/local/lib/python3.2/urllib/request.py", line 344, in _call_chain
result = func(*args)
File "/usr/local/lib/python3.2/urllib/request.py", line 1140, in http_open
return self.do_open(http.client.HTTPConnection, req)
File "/usr/local/lib/python3.2/urllib/request.py", line 1122, in do_open
h.request(req.get_method(), req.selector, req.data, headers)
File "/usr/local/lib/python3.2/http/client.py", line 964, in request
self._send_request(method, url, body, headers)
File "/usr/local/lib/python3.2/http/client.py", line 1002, in _send_request
self.endheaders(body)
File "/usr/local/lib/python3.2/http/client.py", line 960, in endheaders
self._send_output(message_body)
File "/usr/local/lib/python3.2/http/client.py", line 805, in _send_output
self.send(msg)
File "/usr/local/lib/python3.2/http/client.py", line 743, in send
self.connect()
File "/usr/local/lib/python3.2/http/client.py", line 721, in connect
self.timeout, self.source_address)
File "/usr/local/lib/python3.2/socket.py", line 386, in create_connection
sock.settimeout(timeout)
TypeError: a float is required
что это вообще за ошибка?
есть ли нормальный способ отправить файл на сервер с помощью urllib в питон3.2?
cookie-god
urllib2_file
Игнат
для питона 3.2?
Андрей Светлов
http://www.doughellmann.com/PyMOTW/urllib2/index.html#uploading-files
Переделать на тройку труда не составит.
Игнат
спасибо
привел их пример к такому виду: http://pastebin.mozilla.org/1192545

получаю вот что:
  File "/home/python3/urllib_test/start_file.py", line 70, in __str__
return '\r\n'.join(flattened)
TypeError: sequence item 12: expected str instance, bytes found
а если заменить
              'Content-Type: %s' % content_type,
'',
body,
на
              'Content-Type: %s' % content_type,
'',
str(body),
получаем
    raise TypeError("POST data should be bytes"
TypeError: POST data should be bytes or an iterable of bytes. It cannot be str.
Андрей Светлов
так ведь к байтам нужно приводить, а не к строке.
Игнат, похоже вы все еще недостаточно хорошо их различаете
Игнат
а, господи
это при отправке надо делать
    request.add_data(bytes(body, 'utf8'))
только вот утф ли указывать?
с утф работает
Андрей Светлов
Нет, так нельзя. Вы о конструкциях вроде b'Content-Type' слышали?
Игнат
я знаю только что это http-заголовок
а что не так?
Андрей Светлов
b'строка байтов'
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