V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
gfhzhang
V2EX  ›  前端开发

浏览器端大文件(1GB 以上,上不封顶)下载的解决方案有哪些?

  •  
  •   gfhzhang · 348 天前 · 2215 次点击
    这是一个创建于 348 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问题:传统文件下载,比如文件流下载,文件会缓存浏览器端,等待文件下载完成后,才去合并流;如果内存不足,对于多个大文件( 4GB 以上)下载,还是采用浏览器等待完全下载缓存的方式,浏览器将会崩溃;

    最终需要的效果:浏览器能写入本地磁盘临时文件,而不是将文件缓存到内存

    15 条回复    2024-01-15 09:23:49 +08:00
    shoumiao
        1
    shoumiao  
       348 天前 via Android
    看看 mega 是怎喵解决的?
    Joshuahui
        2
    Joshuahui  
       348 天前 via Android
    bitcomet 有个磁盘加速的选项可以调缓存,也可以用插件捕获浏览器的下载
    gfhzhang
        3
    gfhzhang  
    OP
       348 天前
    @Joshuahui 想完全依赖浏览器(不同厂商需要兼容)来处理
    gfhzhang
        4
    gfhzhang  
    OP
       348 天前
    @shoumiao 看了下,猜测它用的是我说的文件流缓存的方式下载的,最后会生成一个 blob 资源链接,但是这种方式弊端还是有的,有些电脑 RAM 本身就没有多少,而且一次下载很大的文件 RAM 存储不了多少数据
    IvanLi127
        5
    IvanLi127  
       348 天前 via Android
    传统方式不是浏览器跳转到下载链接让它自己慢慢下吗?
    ss098
        6
    ss098  
       348 天前
    开源断点续传协议 tus

    https://tus.io/
    ss098
        7
    ss098  
       348 天前
    看错了,是下载不是上传,tus 适用于上传
    okakuyang
        9
    okakuyang  
       348 天前   ❤️ 1
    额,虽然我没实操过。不过浏览器下载文件默认不就是一点点写到磁盘的,虽然最后好像有个校验过程会有点卡的感觉。像 mega 那种用 js 下载文件分片再合并确实会堆在内存里,而且似乎最后下载完成的一瞬间会用大量内存,并卡住。如果要用 js 用流的方式喂到磁盘里,不知道 file system api 里有没有新方案。
    JensenQian
        10
    JensenQian  
       348 天前 via Android
    搞个 idm
    zsj1029
        11
    zsj1029  
       348 天前 via iPhone
    传统的就是写硬盘,mega 做的流式下载才是写内存
    renmu
        12
    renmu  
       348 天前 via Android
    印象中如果你的文件支持 range 下载,浏览器下载不会保存到内存。
    DOLLOR
        13
    DOLLOR  
       348 天前
    @gfhzhang
    MEGA 是写到 OPFS 里的。
    OPFS 支持流式读写,底层是浏览器的本地存储的缓存文件,不会爆内存。
    https://developer.mozilla.org/en-US/docs/Web/API/File_System_API/Origin_private_file_system
    hyperbin
        14
    hyperbin  
       347 天前 via Android
    浏览器不会这么蠢
    menglizhi2333
        15
    menglizhi2333  
       347 天前
    @gfhzhang 这样的需求可以通过 OPFS 来将文件写入到用户授权的目录下, 如果介意授权的话, 可以将文件分片放入 indexDB 中, indexDB 数据内容是持久化放在 chrome 的运行目录里, 这样可以避免授权, 也能存放大文件, 但一定要记得清理, chrome 运行目录默认在 C 盘, 会导致 C 盘存储紧张
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   938 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 21:19 · PVG 05:19 · LAX 13:19 · JFK 16:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.