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

发布于 2021-01-29 15:24:50

不幸的是,我先前的问题由于是问题的“精确副本”而被关闭,而它肯定不是,特此再次。

它不是Python的副本:HTTP通过流发布大文件

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

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

老实说,我想知道是否可以全部解决-如果我想知道,如果不能,那么可以解决这个问题。但是,如果可以做到,那怎么办呢?

关注者
0
被浏览
66
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    从客户的角度来看,这很容易。您可以使用httplib的低级别的界面-
    putrequestputheaderendheaderssend任何你想在任何大小的块服务器-
    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模块,可将分块的请求转换为常规请求。只要您不需要真正的流式传输(在客户端完成发送请求之前开始处理请求),它可能会有所帮助。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看