[求助] Web 项目中大文件下载的解决方案(大于 1GB) - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cqxxxxxxx
V2EX    问与答

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

  •  < href="Javascript:" Onclick="downVoteTopic(666646);" class="vote">
  •   cqxxxxxxx 2020 年 4 月 27 日 5503 次点击
    这是一个创建于 2085 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    考虑方案如下:

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

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

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

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

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

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

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

    特例:除非你们对安全性有要求,需要 client 一直保持认证状态。
    orcusfox
        4
    orcusfox  
       2020 年 4 月 27 日 via iPhone   1
    个人建议文件直接丢给对象存储或者 nginx,都原生实现了后台你要的分片分段的。前端的话,直接在新 tab 打开下载链接,js 应该是没法操作文件系统的。
    cqxxxxxxx
        5
    cqxxxxxxx  
    OP
       2020 年 4 月 27 日
    @fancy111 目前后端我已经支持了基于 range 请求头来下载指定位置的数据,我不清楚前端需要怎么写。。想求个 demo,怎么通过 ajax 或者 axiso 或者其他的把字节流持续写入到某个地方。目前用 axiso 它需要整个请求全部完成后才能执行回调方法。=。=
    cqxxxxxxx
        6
    cqxxxxxxx  
    OP
       2020 年 4 月 27 日
    @napsterwu 基于 nginx 的有关键字吗,我之前倒是没考虑过这个。感觉有可能可以满足我的需求啊。
    killergun
        7
    killergun  
       2020 年 4 月 27 日   1
    上传的时候将文件分片
    murmur
        8
    murmur  
       2020 年 4 月 27 日
    这里分析下客户端的合理性,因为国内的网络各种奇葩,连续下载大文件会到一定时间开始疯狂掉速,浏览器暂停再开起没用,停止重下断点续传又没有了。而且大文件下载的天生问题就是时间长,为了防止盗链,网盘带 token 都是常规设计,如果你下的慢的话,下一半 token 超时,自然被切断,断点续传都没法做。想来想去,这么多奇葩问题,可能国内客户端真的最好的解决方案。
    ohao
        9
    ohao  
       2020 年 4 月 27 日   1
    使用 Chrome 浏览器, 体验下 Mega 的上传和下载 mega.nz
    传个大点的文件试试 然后下载, 你就学会了
    cqxxxxxxx
        10
    cqxxxxxxx  
    OP
       2020 年 4 月 27 日
    @ohao 是的,我之前也想参考下 Mega,但是一直下载速度 0B/S, 我再去试试
    cqxxxxxxx
        11
    cqxxxxxxx  
    OP
       2020 年 4 月 27 日
    @murmur 客户端不受浏览器限制,比较自由。
    qq316107934
        12
    qq316107934  
       2020 年 4 月 27 日   1
    Mega 并不是一个优秀的例子,JS 下载文件都是先放在内存里的,然后再组装以 blob 形式存盘,这样对计算机内存大小有要求,同时并不支持刷新后断点续传,想要稳定好用还是交给 Chrome 的下载管理器吧,Mega 这类用 JS 是额外的加解密需求
    cqxxxxxxx
        13
    cqxxxxxxx  
    OP
       2020 年 4 月 27 日
    @qq316107934 是的,我刚刚浏览了下相关文章发现 blob 大小还是有限制的。目前只是有个基于请求头的权限校验需求。
    marcushbs
        14
    marcushbs  
       2020 年 4 月 27 日   1
    一开始用百度网盘,后来发现微云支持 http 直接下载,果断换坑
    wanguorui123
        15
    wanguorui123  
       2020 年 4 月 28 日 via iPhone
    直接打开链接,链接里面签个过期时间或者加密个过期时间,防止盗链
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     948 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 18:49 PVG 02:49 LAX 10:49 JFK 13:49
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86