通过Python中的HTTP从客户端到服务器流未知大小的数据
不幸的是,我先前的问题由于是问题的“精确副本”而被关闭,而它肯定不是,特此再次。
它不是Python的副本:HTTP通过流发布大文件
那就是处理大文件流;我想将文件的任意块一一发送到相同的http连接。所以我有一个20 MB的文件,我想要做的是打开一个HTTP连接,然后发送1
MB,再发送1 MB,依此类推,直到完成。使用相同的连接,因此服务器看到该连接上出现了20 MB的块。
我也打算映射文件,但是当从标准输入中读取数据时,这是行不通的。主要针对第二种情况,我正在寻找这种分部分的数据馈送。
老实说,我想知道是否可以全部解决-如果我想知道,如果不能,那么可以解决这个问题。但是,如果可以做到,那怎么办呢?
-
从客户的角度来看,这很容易。您可以使用
httplib
的低级别的界面-
,putrequest
,putheader
,endheaders
和send
任何你想在任何大小的块服务器-
to发送。但是,您还需要指出文件的结束位置。
如果您事先知道文件的总大小,则只需添加
Content-Length
标头,服务器将在读完这么多字节后停止读取您的请求正文。代码可能看起来像这样。import httplib import os.path total_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模块,可将分块的请求转换为常规请求。只要您不需要真正的流式传输(在客户端完成发送请求之前开始处理请求),它可能会有所帮助。