在 Python 中通过 HTTP 将未知大小的数据从客户端流式传输到服务器

2023-11-23

不幸的是,我之前的问题因是问题的“精确副本”而被关闭,而它绝对不是,特此再次。

它不是重复的Python:HTTP 使用流式传输大文件

那个处理的是大文件的流传输;我想将文件的任意块一一发送到同一个 http 连接。所以我有一个 20 MB 的文件,我想要做的是打开一个 HTTP 连接,然后发送 1 MB,再发送 1 MB,依此类推,直到完成。使用相同的连接,因此服务器会看到该连接上出现 20 MB 的块。

映射文件也是我打算做的,但是当从标准输入读取数据时,这不起作用。主要针对第二种情况,我正在寻找这种逐部分的数据馈送。

老实说,我想知道是否可以完成 - 如果不能,我想知道,然后可以关闭该问题。但如果可以做到的话,又该如何做到呢?


从客户的角度来看,这很容易。您可以使用httplib的低级接口——putrequest, putheader, endheaders, and send—以任意大小的块将您想要的任何内容发送到服务器。

但您还需要指出文件的结束位置。

如果您事先知道文件的总大小,则可以简单地包括Content-Lengthheader,服务器将在这么多字节后停止读取您的请求正文。代码可能如下所示。

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 模块将分块请求转换为常规请求。只要您不需要真正的流式传输(在客户端发送完请求之前开始处理请求),这可能会有所帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Python 中通过 HTTP 将未知大小的数据从客户端流式传输到服务器 的相关文章

随机推荐