如何将 tqdm.wrapattr 上传的进度传递给函数或变量?

Posted

技术标签:

【中文标题】如何将 tqdm.wrapattr 上传的进度传递给函数或变量?【英文标题】:How can I pass to a function or variable the progress of a tqdm.wrapattr upload? 【发布时间】:2021-12-12 20:00:34 【问题描述】:

背景

我有一个程序,客户端可以在其中查看服务器上的文件列表,然后选择要从服务器上传到 Google Cloud Storage 的文件。当文件从服务器上传到谷歌云存储时,我想让客户端知道文件上传的进度。 到目前为止,我可以使用 tqdm 的 wrapattr 方法在服务器的终端屏幕上显示上传的进度,如下所示:

object_address = str(uuid.uuid4())
upload_url, upload_method = get_upload_url(object_address) # fetches signed upload URL 
size = os.path.getsize(filename)
with open(filename, "rb") as in_file:
    total_bytes = os.fstat(in_file.fileno()).st_size
    with tqdm.wrapattr(
        in_file,
        "read",
        total=total_bytes,
        miniters=1,
        desc="Uploading to my bucket",
    ) as file_obj:
        response = requests.request(
            method=upload_method,
            url=upload_url,
            data=file_obj,
            headers="Content-Type": "application/octet-stream",
        )
        response.raise_for_status()

return object_address, size

问题

我需要将上传进度发送给客户端。如果您只能在服务器的终端屏幕上看到上传进度,那将无济于事。

问题

如何检索上传进度以便将其发送给客户端?

不幸的是,我认为 wrapattr 函数没有任何回调函数的参数,我可以在每次将块上传到 Google Cloud Storage 时调用这些参数。我愿意接受其他无需使用 tqdm wrapattr 方法即可检索进度的方法。

我知道 Google Cloud Storage 具有可恢复的上传功能,可让您跟踪进度,但它们使用 cURL,因此我必须使用子进程,而且我宁愿使用比这更干净的东西。

谢谢!

【问题讨论】:

我可以看到您只共享应用程序中的代码,但是客户端如何与应用程序本身进行交互?您能否添加更多有关用户如何获取您尝试显示的信息的信息?我想你也打算使用终端,但我认为你应该分享更多关于这方面的信息。 @Ginger - 感谢您的反馈。我更新了背景以提供更多细节。客户端将看到服务器上的文件列表。然后客户端会选择服务器上的一个文件从服务器上传到谷歌云存储,服务器会这样做。同样,问题是在文件上传时将上传进度返回给客户端。谢谢! 【参考方案1】:

正如我所见,您已经能够获得进度并成功显示它,但不能在客户端。在这个question 中,他们使用requests 库来获取进度,试图模拟类似于urllib2 POST progress monitoring 的文件适配器:

class IterableToFileAdapter(object):
    def __init__(self, iterable):
        self.iterator = iter(iterable)
        self.length = len(iterable)

    def read(self, size=-1): # TBD: add buffer for `len(data) > size` case
        return next(self.iterator, b'')

    def __len__(self):
        return self.length

您可以使用 tqdm 将此方法应用于您自己的应用程序。

【讨论】:

以上是关于如何将 tqdm.wrapattr 上传的进度传递给函数或变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 curl 上传进度发送到要显示的 ajax

将图像上传到 Firebase 存储时如何制作进度条?

如何使用 alamofire 上传多个文件并显示进度?

如何在 Alamofire 4.0 中添加带有上传进度百分比的标签的进度条

文件上传和进度条

如何跟踪异步文件上传到 Azure 存储的进度