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

2020-04-27 16:01:51 +08:00
 cqxxxxxxx

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

考虑方案如下:

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

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

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

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

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

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

4748 次点击
所在节点    问与答
15 条回复
fancy111
2020-04-27 16:06:30 +08:00
123 可以结合的。 自己可以写
murmur
2020-04-27 16:08:32 +08:00
百度盘的解决方案是大于某个尺寸必须上客户端,我认为这个还真的靠谱
yeze322
2020-04-27 16:13:24 +08:00
建议 4,server 只负责提供一个下载链接,剩下的事情交给 downloader 。

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/666646

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX