如何使用Python请求和Clint监视HTTP PUT上载的进度

如何使用Python请求和Clint监视HTTP PUT上载的进度,python,progress,put,clint,Python,Progress,Put,Clint,我正在编写一个简单的命令行应用程序——允许使用HTTP的“请求”库从transfer.sh服务上载和下载文件,作为学习练习。多亏了这里的一些答案,我能够使用python clint和python requests实现一个进度条,以监控所看到的文件下载功能 无论如何,当我尝试实现同样的进度条来监控上传时,我非常非常迷茫——它使用HTTP PUT。我理解概念上应该是非常相似的,但由于某种原因无法理解,如果有人能为我指出正确的方向,我将非常感激。我尝试了一些使用多部分编码器之类的方法,但这些方法会导致

我正在编写一个简单的命令行应用程序——允许使用HTTP的“请求”库从transfer.sh服务上载和下载文件,作为学习练习。多亏了这里的一些答案,我能够使用python clint和python requests实现一个进度条,以监控所看到的文件下载功能

无论如何,当我尝试实现同样的进度条来监控上传时,我非常非常迷茫——它使用HTTP PUT。我理解概念上应该是非常相似的,但由于某种原因无法理解,如果有人能为我指出正确的方向,我将非常感激。我尝试了一些使用多部分编码器之类的方法,但这些方法会导致文件在升级过程中被损坏(服务接受原始PUT请求,而多部分编码似乎会把它弄糟)

最终目标是编写一个脚本,用随机密钥加密要上传的文件,将其上传到服务,并打印一个链接+加密密钥,供朋友下载/解密文件,主要是为了好玩和填补python中的一些知识空白。

我建议您使用带有
clint.textui.progress
模块的。我发现这个代码可以

from clint.textui.progress import Bar as ProgressBar
from requests_toolbelt import MultipartEncoder, MultipartEncoderMonitor

import requests


def create_callback(encoder):
    encoder_len = encoder.len
    bar = ProgressBar(expected_size=encoder_len, filled_char='=')

    def callback(monitor):
        bar.show(monitor.bytes_read)

    return callback


def create_upload():
    return MultipartEncoder({
        'form_field': 'value',
        'another_form_field': 'another value',
        'first_file': ('progress_bar.py', open(__file__, 'rb'), 'text/plain'),
        'second_file': ('progress_bar.py', open(__file__, 'rb'),
                        'text/plain'),
        })


if __name__ == '__main__':
    encoder = create_upload()
    callback = create_callback(encoder)
    monitor = MultipartEncoderMonitor(encoder, callback)
    r = requests.post('https://httpbin.org/post', data=monitor,
                      headers={'Content-Type': monitor.content_type})
    print('\nUpload finished! (Returned status {0} {1})'.format(
        r.status_code, r.reason
        ))

不管它值多少钱,上面的代码都是POST(而不是PUT)。到目前为止,我的简短调查表明,PUT不起作用(至少进度回调不会被调用)。你是对的。我不知道3个人怎么能投票给一个不回答问题的人。