gpt4 book ai didi

python - 如何使用 Python 3 仅使用内置模块上传大文件?

转载 作者:太空宇宙 更新时间:2023-11-03 20:56:49 25 4
gpt4 key购买 nike

我正在尝试使用 API 将 32+ MB 的文件上传到服务器。我唯一的限制是只能使用内置模块。我见过很多使用 requests 库的示例,但我正在尝试使用 urllib 来解决。使用 curl 作为 PoC,我做了这样的工作:

curl -v --request POST --url 'https://domain/upload/long-string/' --form 'apikey=my-api-key' --form 'file=@my-file.extension'

使用urllib,我编写了下面的代码,但它不起作用,因为服务器总是返回400错误:

import urllib

def post_bigfile(upload_url, file, auth, timeout):
headers = {'Accept': '*/*', 'Content-Type': 'multipart/form-data'}
data = {'file': file, 'apikey': auth}
req = urllib.request.Request(upload_url, headers=headers,
data=urlencode(data).encode('utf-8'), method='POST')
return urllib.request.urlopen(req, timeout=timeout)

post_bigfile('https://domain/upload/long-string/', open('my-file.extension','rb'), 'my-api-key', 20)

我尝试使用 Content-TypeAccept 的不同值,但仍然不起作用。我可能做错了什么?我可以使用另一个内置模块来更好地解决这个问题吗?

最佳答案

可以在这里找到您做错了什么的提示:

'Content-Type': 'multipart/form-data'
headers=headers

不久前我也忙于处理curl命令,这些命令正在推送多部分表单数据并研究仅使用内置python库(即不是请求)来完成它。将 --form 放入 curl 后,您甚至不需要为curl提供 --headers "Content-Type: multipart/form-data" 参数,它只是默认值。也许您没有意识到curl正在这样做。

看看at this ,python不支持该Mime类型。 Python 问题已链接 https://bugs.python.org/issue3244我认为你最好的选择是这个脚本:https://pymotw.com/3/urllib.request/#uploading-files如果您真的只想仅使用标准库来做到这一点。

假设您无法控制接收该文件的服务器,并且看起来它需要带有两个元素“apikey”和“file”的多部分/表单数据。除非您可以将服务器想要的内容更改为 urllib 可以 POST 的内容,否则您将必须使用请求或查看是否可以让那个大的 MultiPartForm 类正常工作。

关于python - 如何使用 Python 3 仅使用内置模块上传大文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55969454/

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