V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
jlak
V2EX  ›  问与答

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

  •  
  •   jlak · 2022-11-12 17:13:00 +08:00 · 1010 次点击
    这是一个创建于 531 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    6 条回复    2022-11-12 21:48:03 +08:00
    vopin
        1
    vopin  
       2022-11-12 17:46:54 +08:00 via iPhone
    文件能有多大?大文件一般分段上传吧。
    xiangyuecn
        2
    xiangyuecn  
       2022-11-12 18:24:36 +08:00
    此回答多写点,显得不那么菜:

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

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

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

    -----

    回到问题上,“通过 api 用 post 上传文件怎么分块”,本质上跟 python 不 python 没有一毛钱关系,更多的是需要 api 提供分块上传支持,比如:单次请求可以上传 4MB 的数据块,每次请求发送文件中的指定位置大小的数据块,失败了就重传这 4MB 的数据,最后全部传完了,再调一个 api 通知合并文件。
    EngAPI
        3
    EngAPI  
       2022-11-12 18:40:16 +08:00
    前面做个方案里是这么解决的
    file.seek(xx,xx)
    file.read(1024*1024*100)
    hsfzxjy
        4
    hsfzxjy  
       2022-11-12 18:45:23 +08:00 via Android
    hsfzxjy
        5
    hsfzxjy  
       2022-11-12 18:46:54 +08:00 via Android   ❤️ 1
    @xiangyuecn 感觉楼主只是没用正确的方法上传,而不是说对方服务器不支持上传大文件
    jlak
        6
    jlak  
    OP
       2022-11-12 21:48:03 +08:00 via iPhone
    服务器是没问题的,我从 mac 上传一切正常
    放倒 1g 内存 vps 后就变 MEMORY ERROR 或 OUT OF MEMEROY 了
    用 4 楼官方写法后就变 killed 了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2805 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 04:06 · PVG 12:06 · LAX 21:06 · JFK 00:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.