gpt4 book ai didi

python - 如何使用表单数据和文件显示 aiohttp POST 的进度

转载 作者:行者123 更新时间:2023-12-05 05:57:53 28 4
gpt4 key购买 nike

好的,这是我的工作代码:

data = aiohttp.FormData()
data.add_field('title', title)
data.add_field('author', user)
data.add_field('upload_file', open(path, 'rb'))

up_session = aiohttp.ClientSession()
async with up_session.post(url="http://example.com/upload.php", data=data) as response:
resp = await response.text()

resp = json.loads(resp)

我想知道的是如何向它添加某种进度监控。我在文档中找不到任何类型的回调,也找不到与 MultipartWriter 一起使用的生成器(FormData 只是 MultipartWriter 的助手)。我在这里失去了理智。提前致谢。

编辑:我曾经通过 request 和 requeststoolbelt(MultipartEncoder、MultipartEncoderMonitor)获取它,但它们不是异步的,而且 aiohttp 是一个如此完整的库,我不敢相信你不能那样做。

    encoder = MultipartEncoder(
fields={
'upload_file': (ntpath.basename(path), open(path, 'rb'),
'application/octet-stream'),
'title': str(''),
'author': str(user),
})
upload_data = MultipartEncoderMonitor(encoder, upload_progress)

headers={'Content-Type': upload_data.content_type}
headers.update(http_headers)

r_2 = session.post(url=url_domain + "/repository/repository_ajax.php?action=upload", data=upload_data)

def upload_progress(monitor):
print (str(monitor.len) + " - " + "{:.2f}%".format(monitor.bytes_read/monitor.len))

最佳答案

我确实找到了一个解决方案,虽然有点老套,但它确实有效,而且对于其他不提供良好进度跟踪但接受二进制流的库来说,它是通用的。它是 BufferedReader 的包装器。从技术上讲,在读取而不是发送时计算字节数,但对于进度条来说,它有点相同。

from pathlib import Path
from io import BufferedReader
from aiohttp import ClientSession


class ProgressFileReader(BufferedReader):
def __init__(self, filename, read_callback=None):
f = open(filename, "rb")
self.__read_callback = read_callback
super().__init__(raw=f)
self.length = Path(filename).stat().st_size

def read(self, size=None):
calc_sz = size
if not calc_sz:
calc_sz = self.length - self.tell()
if self.__read_callback:
self.__read_callback(self.tell(), self.length)
return super(ProgressFileReader, self).read(size)


def progress_callback(current, total):
print(100 * current // total)


async def main():
with ProgressFileReader(filename="./file.jpg", read_callback=progress_callback) as file:
upload_payload = {
"foo": "bar",
"file": file,
}
async with ClientSession() as session:
async with session.post("http://example.org", data=upload_payload) as response:
resp = await response.text()

包装器本身是同步的,但这没什么大不了的,如果您包装 aiofiles 而不是内置的“open”,它可以变成异步的。将包装器类的想法归功于我现在找不到的其他一些 stackoverflow 问题。

关于python - 如何使用表单数据和文件显示 aiohttp POST 的进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68690141/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com