Python请求模块:将非常大的文件分块发布以监视进度

2022-05-21 07:27:24 发布

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

我正在Windows10上使用Python 3.8,使用requests模块。正如标题所示,我正在将非常大的文件发布到HTTP服务器,我想提供上传的状态

我已经阅读了10-20篇关于这个主题的堆栈溢出线程,阅读了散布在互联网上的文章,并且深入研究了GitHub上的项目的源代码,我现在都记不起来了。我试图实现我读到的所有东西,但都无济于事。关于这个主题的很多信息都已经过时了,而且requests模块已经有了很大的改进,因此一些信息可能已经过时了

我遇到的问题是使用requests.Response.post('Some-URL', data=file_chunk, header=header)发送文件块。如果上载了5个文件块,则服务器上有5个单独的文件,而不是1个组合文件

为了提供文件上传的状态,我创建了一个生成器函数,类似于下面的示例

def read_in_chunks(file_object, chunk_size=1024):
    """Generator to read a file piece by piece.
    Default chunk size: 1k."""
    while True:
        data = file_object.read(chunk_size)
        if not data:
            break
        yield data

然后,我迭代了生成器对象,该对象是这样创建的:

with open('Some-File.zip', 'rb') as file_obj:
    for file_chunk in read_in_chunks(file_obj):
        requests.Response.post('Some-URL', data=file_chunk.encode('utf-8'), header=header)

这是行不通的。在上载文件块的服务器上,每个块作为单独的文件存储在服务器上。如果文件被分成5个块,那么现在有5个文件。在requests{a1}中,它表示可以将生成器函数传递给data=参数,尽管我无法让它工作。文档还说要使用Response.iter_content()对数据进行迭代,但我不知道这到底意味着什么,也不知道如何实现它。关于这个主题的文档似乎有点稀疏

我还尝试在代码here之后使用requests-toolbelt。代码与文档中的示例几乎相同。我经历了上述同样的问题。我还创建了一个SHA-256散列文件之前,我上传它和散列将改变每一次我执行脚本之前,上传开始。。。不知道,所以我停止使用这种方法

在服务器端,可能不支持区块文件上传,如果我正确地实现了这一点,我会这么想


Tags: 模块文件in文档服务器主题readdatasizeresponsesomerequestsfileheaderchunk