python - urllib2 POST进度监控

标签 python http urllib2 http-post

我正在通过 POST 将一个带有 urllib2 的相当大的文件上传到服务器端脚本。我想显示一个进度指示器,显示当前上传进度。是否有 urllib2 提供的 Hook 或回调允许我监控上传进度?我知道您可以通过连续调用连接的 read() 方法来下载,但我没有看到 write() 方法,您只需将数据添加到请求即可。

最佳答案

这是可能的,但你需要做一些事情:

  • 伪造 urllib2 子系统,通过附加一个 __len__ 属性将文件句柄向下传递给 httplib,这使得 len(data) 返回正确的大小,用于填充内容长度 header 。
  • 覆盖文件句柄上的 read() 方法:当 httplib 调用 read() 时,您的回调将被调用,让您计算百分比并更新进度条.

这可以用于任何类似文件的对象,但我包装了 file 以展示它如何用于从磁盘流式传输的非常大的文件:

import os, urllib2
from cStringIO import StringIO

class Progress(object):
    def __init__(self):
        self._seen = 0.0

    def update(self, total, size, name):
        self._seen += size
        pct = (self._seen / total) * 100.0
        print '%s progress: %.2f' % (name, pct)

class file_with_callback(file):
    def __init__(self, path, mode, callback, *args):
        file.__init__(self, path, mode)
        self.seek(0, os.SEEK_END)
        self._total = self.tell()
        self.seek(0)
        self._callback = callback
        self._args = args

    def __len__(self):
        return self._total

    def read(self, size):
        data = file.read(self, size)
        self._callback(self._total, len(data), *self._args)
        return data

path = 'large_file.txt'
progress = Progress()
stream = file_with_callback(path, 'rb', progress.update, path)
req = urllib2.Request(url, stream)
res = urllib2.urlopen(req)

输出:

large_file.txt progress: 0.68
large_file.txt progress: 1.36
large_file.txt progress: 2.04
large_file.txt progress: 2.72
large_file.txt progress: 3.40
...
large_file.txt progress: 99.20
large_file.txt progress: 99.87
large_file.txt progress: 100.00

关于python - urllib2 POST进度监控,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5925028/

相关文章:

python - 如何使用 python 和 PyQt5 将目录和文件列表从普通列表转换为树列表

python - 服务器启动后如何继续python脚本?

Python httplib.InvalidURL : nonnumeric port fail

python - Pandas 将 Nan 列值更改为 True 或 False

python - 是否有现成的 HTTP 服务器用于调试目的?

c# - 如何访问 ApiController 中的 Response

http - 使用 Zapier Webhook 触发器访问请求 header

python - 什么情况下urllib2会比IE8慢很多?

python - 如何使用 Python 在我的 google fusion 表中插入一行

python - cx_freeze : How do I resolve conflicts caused by multiple . 同名dylib文件