失效链接处理 |
如何解决大文件上传问题? PDF 下载
本站整理下载:
相关截图:
![]()
主要内容:
如果你的项⽬涉及到⽂件上传的话,⾯试官很可能会问你这个问题。
我们先看第⼀个场景:⼤⽂件上传中途,突然失败!
试想⼀个,你想上传⼀个 5g 的视频,上传进度到 99% 的时候,特么的,突然⽹络断了,这个时候,你发
现⾃⼰竟然需要重新上传。我就问你抓狂不?
有没有解决办法呢? 答案就是:分⽚上传!
什么是分⽚上传呢? 简单来说,我们只需要先将⽂件切分成多个⽂件分⽚(就像我下⾯绘制的图⽚所展示
的那样),然后再上传这些⼩的⽂件分⽚。
前端发送了所有⽂件分⽚之后,服务端再将这些⽂件分⽚进⾏合并即可。
使⽤分⽚上传主要有下⾯ 2 点好处:
1. 断点续传 :上传⽂件中途暂停或失败(⽐如遇到⽹络问题)之后,不需要重新上传,只需要上传那些
未成功上传的⽂件分⽚即可。所以,分⽚上传是断点续传的基础。
2. 多线程上传 :我们可以通过多线程同时对⼀个⽂件的多个⽂件分⽚进⾏上传,这样的话就⼤⼤加快的
⽂件上传的速度。
前端怎么⽣成⽂件分⽚呢?后端如何合并⽂件分⽚呢?
前端可以通过 Blob.slice() ⽅法来对⽂件进⾏切割( File 对象是继承 Blob 对象的,因此 Fil
e 对象也有 slice() ⽅法)。
⽣成⽂件切⽚的示例代码如下:
RandomAccessFile 类可以帮助我们合并⽂件分⽚,示例代码如下:
何为秒传?
秒传说的就是我们在上传某个⽂件的时候,⾸先根据⽂件的唯⼀标识判断⼀下服务端是否已经上传过该⽂
件,如果上传过的话,直接就返回给⽤户⽂件上传成功即可。
⼀般情况下,这个唯⼀标识都是通过对⽂件的名称、最后修改时间等信息取 MD5 值得到的,这个可以通
过使⽤ spark-md5 这个库来⽣成。
需要注意的是:你不能根据⽂件名就决定⽂件是否已经上传到服务端,因为很可能存在⽂件名相同,但
是,内容不同的情况。另外,体验更好的是⽂件内容不变,唯⼀标识就不应该改变。因此,我们可以根据
⽂件的内容来计算 MD5 值。
另外,还存在⼀种情况是我们要上传的⽂件已经上传了部分⽂件切⽚到服务端。这个时候,我们直接返回
已上传的切⽚列表给前端即可
|