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

[求助] Web 项目中大文件下载的解决方案(大于 1GB)

  •  
  •   cqxxxxxxx · 2020-04-27 16:01:51 +08:00 · 4996 次点击
    这是一个创建于 1700 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在已经有一个基于 vue+axiso 的下载功能,因为目前下载的文件都比较大( 500M 往上) 所以考虑到可能的因为各种原因导致的传输失败问题,需要提供恢复(继续)下载的功能。

    考虑方案如下:

    1. 服务端把文件切分成 N 个小文件,前端进行 N 次请求后合并成一个文件。

    2. 基于 Http 的 Range 请求头处理

    3. 基于 ws 进行下载,也是跟 range 类似,其实跟 http 没什么区别

    4. 直接使用 chrome 的下载管理,chrome 支持暂停,继续的功能

    其他: 各种在线网盘是如何实现类似功能的?

    个人倾向于 2 来做,但是找不到前端的 demo,不知道怎么能把字节流持续写入到某个文件或者前端对象里。

    第 1 条附言  ·  2020-04-27 17:22:47 +08:00
    仔细想了下,我现在主要的问题就是,前端怎么把分段下载后的内容合并成一个文件。
    15 条回复    2020-04-28 08:16:20 +08:00
    fancy111
        1
    fancy111  
       2020-04-27 16:06:30 +08:00   ❤️ 1
    123 可以结合的。 自己可以写
    murmur
        2
    murmur  
       2020-04-27 16:08:32 +08:00   ❤️ 1
    百度盘的解决方案是大于某个尺寸必须上客户端,我认为这个还真的靠谱
    yeze322
        3
    yeze322  
       2020-04-27 16:13:24 +08:00
    建议 4,server 只负责提供一个下载链接,剩下的事情交给 downloader 。

    特例:除非你们对安全性有要求,需要 client 一直保持认证状态。
    napsterwu
        4
    napsterwu  
       2020-04-27 16:15:18 +08:00 via iPhone   ❤️ 1
    个人建议文件直接丢给对象存储或者 nginx,都原生实现了后台你要的分片分段的。前端的话,直接在新 tab 打开下载链接,js 应该是没法操作文件系统的。
    cqxxxxxxx
        5
    cqxxxxxxx  
    OP
       2020-04-27 16:15:42 +08:00
    @fancy111 目前后端我已经支持了基于 range 请求头来下载指定位置的数据,我不清楚前端需要怎么写。。想求个 demo,怎么通过 ajax 或者 axiso 或者其他的把字节流持续写入到某个地方。目前用 axiso 它需要整个请求全部完成后才能执行回调方法。=。=
    cqxxxxxxx
        6
    cqxxxxxxx  
    OP
       2020-04-27 16:17:34 +08:00
    @napsterwu 基于 nginx 的有关键字吗,我之前倒是没考虑过这个。感觉有可能可以满足我的需求啊。
    killergun
        7
    killergun  
       2020-04-27 16:19:14 +08:00   ❤️ 1
    上传的时候将文件分片
    murmur
        8
    murmur  
       2020-04-27 16:57:37 +08:00
    这里分析下客户端的合理性,因为国内的网络各种奇葩,连续下载大文件会到一定时间开始疯狂掉速,浏览器暂停再开起没用,停止重下断点续传又没有了。而且大文件下载的天生问题就是时间长,为了防止盗链,网盘带 token 都是常规设计,如果你下的慢的话,下一半 token 超时,自然被切断,断点续传都没法做。想来想去,这么多奇葩问题,可能国内客户端真的最好的解决方案。
    ohao
        9
    ohao  
       2020-04-27 17:01:28 +08:00   ❤️ 1
    使用 Chrome 浏览器, 体验下 Mega 的上传和下载 mega.nz
    传个大点的文件试试 然后下载, 你就学会了
    cqxxxxxxx
        10
    cqxxxxxxx  
    OP
       2020-04-27 17:13:40 +08:00
    @ohao 是的,我之前也想参考下 Mega,但是一直下载速度 0B/S, 我再去试试
    cqxxxxxxx
        11
    cqxxxxxxx  
    OP
       2020-04-27 17:14:40 +08:00
    @murmur 客户端不受浏览器限制,比较自由。😋
    qq316107934
        12
    qq316107934  
       2020-04-27 17:29:32 +08:00   ❤️ 1
    Mega 并不是一个优秀的例子,JS 下载文件都是先放在内存里的,然后再组装以 blob 形式存盘,这样对计算机内存大小有要求,同时并不支持刷新后断点续传,想要稳定好用还是交给 Chrome 的下载管理器吧,Mega 这类用 JS 是额外的加解密需求
    cqxxxxxxx
        13
    cqxxxxxxx  
    OP
       2020-04-27 17:50:49 +08:00
    @qq316107934 是的,我刚刚浏览了下相关文章发现 blob 大小还是有限制的。目前只是有个基于请求头的权限校验需求。
    marcushbs
        14
    marcushbs  
       2020-04-27 17:56:30 +08:00   ❤️ 1
    一开始用百度网盘,后来发现微云支持 http 直接下载,果断换坑
    wanguorui123
        15
    wanguorui123  
       2020-04-28 08:16:20 +08:00 via iPhone
    直接打开链接,链接里面签个过期时间或者加密个过期时间,防止盗链
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2669 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 15:08 · PVG 23:08 · LAX 07:08 · JFK 10:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.