41 条回复  ·  1116 次点击
heiya 小成 2024-8-23 16:00:39

关于断点续传

我的做法是:
1.前端做好分片,为每一个分片生成序号,统计分片的个数。将这些数据传给后端,后端把这些数据记录下来,为这个文件生成一个全局 id ,返回给前端。
2.前端每次上传分片会连带文件 id+分片 id 一起传过来。分片文件会被上传到一个临时目录。每上传完成一个分片,后端会记录下来分片 id (分片序号)。如果是并发上传的话,要注意已上传分片 id 集合会有线程安全问题,不然会出现某个分片已上传但没记录的问题。
3.后端返回已上传分片集合。同时会有一个异步线程判断该文件 id 下的分片是否全都上传完毕。如果全都上传完成,调用文件系统 SDK 的合并文件方法(我用的是 minio ),合并完成之后,删除临时文件目录的分片。
4.与此同时,前端全部分片上传完成之后,循环调用获取文件合并状态接口。
完成~
klo424 小成 2024-8-23 16:49:11

关于断点续传

@humbass #15
1. 前端生成一个文件 id ,连带文件 size 、offset 和二进制数据传给后端。
2. 后端生成一个 size 大小的空文件,根据 id 找到文件,再根据 offset 去寻找位置写入二进制数据。
3. 后端写完数据返回成功,前端 offset 更新继续传下一个二进制数据给后端,以此循环。
4. 如果断了,下次打开页面时,从后端获取到未完成的文件 id ,再执行 1-3 过程。
cstj0505 小成 2024-8-23 16:51:18

关于断点续传

其实分片这东西完全是浏览器限制,不用 js,用个流式写入大文件直接边读边写
yaodong0126 小成 2024-8-23 16:55:20

关于断点续传

好家伙,你们但凡看过断点续传的原理,就说不出什么转移合并的话
trzzzz 小成 2024-8-23 17:28:11

关于断点续传

@heiya 透传 minio 的 uploadId 给前端,前端每次上传分片就带上 uploadId 和 partNumber 。服务器收到一片也不用写本地,直接透传到 minio ,我习惯这样。
但这样在弱网环境下会有问题,简单说个 流的 retry 需要自己写,这个是最麻烦的。如果是弱网还是建议先写 tmp 再异步上传
ZZ74 小成 2024-8-23 17:43:23

关于断点续传

@klo424
复议 这才是断点续传的最初或者真实的做法。
OP 可以用这种方式避免重新组合文件。java 这边对应的 radomaccessfile....
另外为啥要组合?如果服务器不需要读取处理啥的,只是提供存储,直接存分片,下载的时候由前端拼也可以。
我不懂前端,你这 20G 的文件 前端下载时是否合并的了得打个问号
netnr 初学 2024-8-23 18:38:24

关于断点续传

用 tus 协议
https://tus.io/
https://uppy.io/
okakuyang 小成 2024-8-23 18:57:04

关于断点续传

这些不都是基操吗,检查下自己代码,怕不是有 bug
hetal 小成 2024-8-23 21:28:28

关于断点续传

rsync 不行么?
zhaokun 小成 2024-8-24 09:19:47

关于断点续传

内网搭建一台开源的对象存储
返回顶部