В документации не сказано, что вы можете сделать это, но код в urllib2 (и httplib) принимает любой объект с методом read () в качестве данных. Таким образом, использование открытого файла, кажется, делает свое дело.
Вам нужно установить заголовок Content-Length самостоятельно. Если он не установлен, urllib2 вызовет len () для данных, которые файловые объекты не поддерживают.
import os.path
import urllib2
data = open(filename, 'r')
headers = { 'Content-Length' : os.path.getsize(filename) }
response = urllib2.urlopen(url, data, headers)
Это соответствующий код, который обрабатывает предоставленные вами данные. Это из HTTPConnection
класса в httplib.py
в Python 2.7:
def send(self, data):
"""Send `data' to the server."""
if self.sock is None:
if self.auto_open:
self.connect()
else:
raise NotConnected()
if self.debuglevel > 0:
print "send:", repr(data)
blocksize = 8192
if hasattr(data,'read') and not isinstance(data, array):
if self.debuglevel > 0: print "sendIng a read()able"
datablock = data.read(blocksize)
while datablock:
self.sock.sendall(datablock)
datablock = data.read(blocksize)
else:
self.sock.sendall(data)