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

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

  •  
  •   gfhzhang · 2024-01-14 17:06:09 +08:00 · 2246 次点击
    这是一个创建于 367 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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