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

pro*_*bat 5 python post chunks python-3.x python-requests

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

我已经阅读了 10-20 个关于这个主题的 Stack Overflow 帖子,阅读了互联网上散布的文章,并深入研究了 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
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

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

我也尝试在此处requests-toolbelt使用以下代码。该代码与文档中的示例几乎相同。我遇到了上述相同的问题。我还在上传文件之前创建了文件的 SHA-256 哈希值,并且每次在上传开始之前执行脚本时哈希值都会发生变化...不知道,所以我停止使用此方法。

有可能在服务器端不支持块文件上传,如果我正确实现的话,这是我的想法。