2

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

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

最终目标是编写一个脚本,用随机密钥对要上传的文件进行AES加密,上传到服务,并打印一个链接+加密密钥,供朋友下载/解密文件,主要用于有趣并填补我的python中的一些知识空白。

4

1 回答 1

2

我建议您将requests_toolbeltclint.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
        ))
于 2016-03-21T22:12:31.087 回答