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

2024-04-24 16:57:41 发布

您现在位置:Python中文网/ 问答频道 /正文

不幸的是,我之前的问题因为是一个问题的“精确副本”而被关闭,而它肯定不是,在此再次。

它不是Python: HTTP Post a large file with streaming的副本

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

我也打算映射一个文件,但当从stdin读取数据时,这不起作用。对于第二种情况,我主要是在逐部分地查找数据。

老实说,我想知道这件事到底能不能完成——如果不能,我想知道,那就可以结束这个问题。但如果能做到,怎么能做到呢?


Tags: 文件服务器httpwithstdin副本情况流式
1条回答
网友
1楼 · 发布于 2024-04-24 16:57:41

从客户的角度来看,这很容易。您可以使用^{}的低级接口-^{}^{}^{}^{}-以任何大小的块向服务器发送您想要的任何内容。

但是你也需要指出你的文件的结尾。

如果预先知道文件的总大小,只需包含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()

如果事先不知道总大小,理论上的答案是chunked transfer encoding。问题是,虽然它被广泛用于响应,但它似乎不太受请求欢迎(尽管它的定义也很好)。股票HTTP服务器可能无法处理它的开箱即用。但是,如果服务器也在您的控制之下,您可以尝试手动解析请求主体中的块并将它们重新组合到原始文件中。

另一种选择是通过同一个连接将每个块作为单独的请求(使用Content-Length)发送。但是您仍然需要在服务器上实现自定义逻辑。此外,您需要在请求之间保持状态。

添加了2012-12-27。an nginx module可以将分块请求转换为常规请求。只要不需要真正的流式处理(在客户端完成发送之前开始处理请求),就可能会有所帮助。

相关问题 更多 >