从客户的角度来看,这很容易。您可以使用
httplib的低级别的界面-
,
putrequest,
putheader,
endheaders和
send任何你想在任何大小的块服务器-
to发送。
但是,您还需要指出文件的结束位置。
如果您事先知道文件的总大小,则只需添加
Content-Length标头,服务器将在读完这么多字节后停止读取您的请求正文。代码可能看起来像这样。
import httplibimport os.pathtotal_size = os.path.getsize('/path/to/file')infile = open('/path/to/file')conn = httplib.HTTPConnection('example.org')conn.connect()conn.putrequest('POST', '/upload/')conn.putheader('Content-Type', 'application/octet-stream')conn.putheader('Content-Length', str(total_size))conn.endheaders()while True: chunk = infile.read(1024) if not chunk: break conn.send(chunk)resp = conn.getresponse()如果您事先不知道总大小,则理论上的答案是分块传输编码。问题是,尽管它广泛用于响应,但似乎对请求的要求不高(尽管定义明确)。库存的HTTP服务器可能无法立即使用它。但是,如果服务器也处于您的控制之下,则可以尝试从请求正文中手动解析这些块,然后将它们重新组装到原始文件中。
另一种选择是
Content-Length通过同一连接将每个块作为单独的请求(带有)发送。但是您仍然需要在服务器上实现自定义逻辑。此外,您需要在请求之间保持状态。
新增2012-12-27。
有一个nginx模块,可将分块的请求转换为常规请求。只要您不需要真正的流式传输(在客户端完成发送请求之前开始处理请求),它可能会有所帮助。



