现在已经有一个基于 vue+axiso 的下载功能,因为目前下载的文件都比较大( 500M 往上) 所以考虑到可能的因为各种原因导致的传输失败问题,需要提供恢复(继续)下载的功能。
考虑方案如下:
服务端把文件切分成 N 个小文件,前端进行 N 次请求后合并成一个文件。
基于 Http 的 Range 请求头处理
基于 ws 进行下载,也是跟 range 类似,其实跟 http 没什么区别
直接使用 chrome 的下载管理,chrome 支持暂停,继续的功能
其他: 各种在线网盘是如何实现类似功能的?
个人倾向于 2 来做,但是找不到前端的 demo,不知道怎么能把字节流持续写入到某个文件或者前端对象里。
1
fancy111 2020-04-27 16:06:30 +08:00 1
123 可以结合的。 自己可以写
|
2
murmur 2020-04-27 16:08:32 +08:00 1
百度盘的解决方案是大于某个尺寸必须上客户端,我认为这个还真的靠谱
|
3
yeze322 2020-04-27 16:13:24 +08:00
建议 4,server 只负责提供一个下载链接,剩下的事情交给 downloader 。
特例:除非你们对安全性有要求,需要 client 一直保持认证状态。 |
4
napsterwu 2020-04-27 16:15:18 +08:00 via iPhone 1
个人建议文件直接丢给对象存储或者 nginx,都原生实现了后台你要的分片分段的。前端的话,直接在新 tab 打开下载链接,js 应该是没法操作文件系统的。
|
5
cqxxxxxxx OP @fancy111 目前后端我已经支持了基于 range 请求头来下载指定位置的数据,我不清楚前端需要怎么写。。想求个 demo,怎么通过 ajax 或者 axiso 或者其他的把字节流持续写入到某个地方。目前用 axiso 它需要整个请求全部完成后才能执行回调方法。=。=
|
7
killergun 2020-04-27 16:19:14 +08:00 1
上传的时候将文件分片
|
8
murmur 2020-04-27 16:57:37 +08:00
这里分析下客户端的合理性,因为国内的网络各种奇葩,连续下载大文件会到一定时间开始疯狂掉速,浏览器暂停再开起没用,停止重下断点续传又没有了。而且大文件下载的天生问题就是时间长,为了防止盗链,网盘带 token 都是常规设计,如果你下的慢的话,下一半 token 超时,自然被切断,断点续传都没法做。想来想去,这么多奇葩问题,可能国内客户端真的最好的解决方案。
|
12
qq316107934 2020-04-27 17:29:32 +08:00 1
Mega 并不是一个优秀的例子,JS 下载文件都是先放在内存里的,然后再组装以 blob 形式存盘,这样对计算机内存大小有要求,同时并不支持刷新后断点续传,想要稳定好用还是交给 Chrome 的下载管理器吧,Mega 这类用 JS 是额外的加解密需求
|
13
cqxxxxxxx OP @qq316107934 是的,我刚刚浏览了下相关文章发现 blob 大小还是有限制的。目前只是有个基于请求头的权限校验需求。
|
14
marcushbs 2020-04-27 17:56:30 +08:00 1
一开始用百度网盘,后来发现微云支持 http 直接下载,果断换坑
|
15
wanguorui123 2020-04-28 08:16:20 +08:00 via iPhone
直接打开链接,链接里面签个过期时间或者加密个过期时间,防止盗链
|