用 Python 通过 api 用 post 上传文件怎么分块?

2022-11-12 17:13:00 +08:00
 jlak

很多网站上传东西都有提供 api 可以用 requests 这些库 with open 后发简单的 post 请求就能上传 但是对于小内存机子上传大文件就会爆内存 请问怎么做才能不全部读取到内存再上传

1018 次点击
所在节点    问与答
6 条回复
vopin
2022-11-12 17:46:54 +08:00
文件能有多大?大文件一般分段上传吧。
xiangyuecn
2022-11-12 18:24:36 +08:00
此回答多写点,显得不那么菜:

“会爆内存”,明显的 http 请求实现的问题,body 部分并没有哪里约束了必须一次性先生成一个完整的 body 才能发送请求。

稍微聪明那么一点的底层框架代码,都应该读一点发送一点,不存在内存问题(但实现代码会很复杂)。

大文件需要注意的就是失败如何重传的问题,只通过一个请求发送大文件,如果传到 99%的时候失败了,那都得从头再来。

-----

回到问题上,“通过 api 用 post 上传文件怎么分块”,本质上跟 python 不 python 没有一毛钱关系,更多的是需要 api 提供分块上传支持,比如:单次请求可以上传 4MB 的数据块,每次请求发送文件中的指定位置大小的数据块,失败了就重传这 4MB 的数据,最后全部传完了,再调一个 api 通知合并文件。
EngAPI
2022-11-12 18:40:16 +08:00
前面做个方案里是这么解决的
file.seek(xx,xx)
file.read(1024*1024*100)
hsfzxjy
2022-11-12 18:45:23 +08:00
hsfzxjy
2022-11-12 18:46:54 +08:00
@xiangyuecn 感觉楼主只是没用正确的方法上传,而不是说对方服务器不支持上传大文件
jlak
2022-11-12 21:48:03 +08:00
服务器是没问题的,我从 mac 上传一切正常
放倒 1g 内存 vps 后就变 MEMORY ERROR 或 OUT OF MEMEROY 了
用 4 楼官方写法后就变 killed 了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/894722

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX