La documentación no dice que usted puede hacer esto, pero el código en urllib2 (y httplib) acepta cualquier objeto con un método de lectura() como datos. Entonces, usar un archivo abierto parece ser el truco.
Deberá configurar el encabezado Content-Length usted mismo. Si no está configurado, urllib2 llamará a len() en los datos, que los objetos de archivo no son compatibles.
import os.path
import urllib2
data = open(filename, 'r')
headers = { 'Content-Length' : os.path.getsize(filename) }
response = urllib2.urlopen(url, data, headers)
Este es el código relevante que maneja los datos que proporciona. Es de la clase HTTPConnection
en httplib.py
en 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)
relacionadas: [archivo WSGI de streaming con un generador] (http : //stackoverflow.com/questions/11811404/) –
Relacionados: http://stackoverflow.com/questions/2502596/python-http-post-alarge-file-with-streaming –