urllib2 написать в апстрим - PullRequest
1 голос
/ 02 марта 2012

Я хочу загрузить (большой) случайный контент в конечную точку HTTP. Я создаю это, посылаю это, и это никогда не используется снова. Поэтому я хотел бы пропустить сохранение его во временном файле и использование { 'file':open() }, поскольку мне также нужно использовать форму-urlencoded (вместо multipart).
Я использовал pycurl и его опцию READFUNCTION, но я не хочу зависеть от pycurl.

Возможно ли достичь этого с помощью urllib2 ?

У меня есть этот код:

def upload():
    url = 'http://localhost:9999/'
    values = {'name' : 'Michael Foord',
          'location' : 'Northampton',
          'language' : open(file).read() }
    data = urllib.urlencode(values)
    req = urllib2.Request(url, data)
    response = urllib2.urlopen(req)
    the_page = response.read()

Но в том виде, в каком он есть, весь файл будет прочитан, когда определено значения .
Так что, если file имеет размер 1 Гб, это не будет работать очень хорошо (если я не пойму, как это работает). Кроме того, я бы предпочел не создавать случайно заполненный файл объемом 1 ГБ.


Хорошо, я могу создать подкласс StringIO , как упомянул Даниэль, и создать случайные данные в read () , но как мне сделать urllib2 ask для read () chunks при загрузке вместо того, чтобы хранить все в памяти сразу?


В попытке быть более конкретным, мне бы очень хотелось, чтобы в Java было что-то вроде urlConnectionInstance.getOutputStream(), и затем я мог бы писать в него. Или как-то сказать urllib2 читать из моего собственного потока , в то время как фактически выдает данные в потоке загрузки.

Ответы [ 3 ]

2 голосов
/ 02 марта 2012

Вы можете использовать модуль httplib в стандартной библиотеке python: http://docs.python.org/library/httplib.html#httplib.HTTPConnection.request

.. В качестве альтернативы это может быть объект открытого файла, в этом случае содержимое файла отправляется; Этот файловый объект должен поддерживать методы fileno () и read (). ..

2 голосов
/ 02 марта 2012

Я не уверен точно, где у вас возникли трудности, но похоже, что вы должны создавать изображение в объекте StringIO, который представляет собой строку, которая действует как файл.Затем вы можете использовать метод read(), чтобы включить эти данные как часть стандартных данных запроса с урлен-кодированием.

0 голосов
/ 02 марта 2012

Я думаю, что главная проблема в том, что urllib.urlencode не поддерживает ваш подход.Если вы создаете собственный класс с методом read(size), который создает фрагменты правильно закодированных данных, это должно работать для параметра data.Хотя не пробовал это.

...