大文件上传不再难:秒传、分片、断点续传,一网打尽!

151 阅读5分钟

大文件上传、秒传、分片上传、断点续传:概念与实现 在日常开发中,我们经常会遇到大文件上传、秒传、分片上传、断点续传等概念,这些技术究竟是什么意思?它们之间又有什么关联呢?本文将从实际场景出发,逐步解释这些概念,并探讨它们的实现原理。

场景引入

假设你是一个刚入职的程序员,领导要求你为项目添加一个网盘功能,用于存储资料。你自信地写下了以下代码并提交:

@Controller 
public class FileUploadController { 
    @Autowired private UploadService uploadService; 
    @PostMapping("/upload") public String handleFileUpload(@RequestParam("file") MultipartFile file) { 
    uploadService.upload(file); return "OK"; 
    } 
   } 

起初,这段代码运行良好,文件可以正常上传。然而,测试时发现前端响应超时。你可能会说:“这是前端的问题,关我什么事?前端把响应事件延长不就得了。”随后,前端同事过来“友好”地提醒你:“你不会用分片上传吗?连这都不会,做什么开发?”你心虚地回答:“我当然会,只不过觉得麻烦而已。”虽然你装作很懂的样子,但实际上心里没底。 为了避免这种情况,本文将详细讲解这些概念及其实现。

基本概念

大文件上传

大文件上传是指上传体积较大的文件。具体多大的文件算大文件,取决于实际场景。在网络较差的情况下,甚至10MB的文件也可能被视为大文件。

分片上传

分片上传是解决大文件上传问题的一种方案。其基本思想是将整个文件切分为多个分片,然后逐个或多个一起上传。举个例子,搬一箱书时,如果箱子太重,你会选择先搬一半或三分之一,剩下的下次再搬,或者叫上朋友一起搬。分片上传的原理与此类似。

断点续传

断点续传是分片上传过程中的一个小场景。继续以搬书为例,如果你搬到一半时被叫去做其他事情,回来后自然会继续搬剩下的书。断点续传也是如此,文件上传到一半时网络中断,恢复后只需上传剩余部分,而不必从头开始。

秒传

秒传的概念与上述例子不太相同。假设你是一个图书管理员,有人来借书时,你会先查找书库中是否有这本书。如果没有,就去订购并入库;如果第二天其他人来借同一本书,你查询后发现书还在,直接交给对方即可。秒传的原理类似:上传文件后,系统会生成一个唯一的编号(如MD5值),下次上传时,前端先计算文件的MD5值并查询后端,如果文件已存在,则无需再次上传,用户感知到的就是“秒传”。

实现原理

  1. 首先由前端计算md5值(独一无二的)发给后端(询问请求
  2. 后端收到md5值去数据库查询是否上传过这个文件(文件表每一个上传的文件有一项md5列),并返回查询结果
    1. 如果存在就返回一个标记(前后端商量好的一个标记)
    2. 如果不存在,先去查询一下是否有这个文件的已上传分片(分片上传)这里不清楚没关系先往下看
  3. 前端根据结果进行判断
    1. 如果存在,就直接显示给用户上传完毕(秒传
    2. 如果不存在接着往下走
  4. 此时不存在就要进行上传,将文件进行切片(可以是一片10M或100M都可以,和后端统一)(每个切片都有一个编号 如 1-10),然后根据后端返回的内容查看哪些编号分片已经上传了,如果这个上传了就不用上传了,只上传没有的就可以了(分片上传)
  5. 后端收到分片后,先根据md5值或其它特征,将分片放到一个 缓存地点(根据实际场景结合,可以是本地文件夹,也可以是云存储文件夹,总之这个文件夹或文件分片存储地可以被唯一标识(可以用md5))(当前端发送 询问请求 后就可以在这里查找哪些编号上传了返回给前端)
  6. 前端发现全部分片都上传成功后,向后端发送合并请求(带着md5)
  7. 后端收到合并请求,根据md5去相应的文件夹去查找这些分片,将这些分片进行合并成一个大文件

总结

大文件上传、分片上传、断点续传、秒传的实现过程并不复杂,核心在于通过MD5值等唯一标识,协调前后端的操作。MD5值的作用类似于Session,使前后端能够感知上传进度和状态。具体的代码实现,我们将在后续文章中详细讲解。 希望本文能帮助你更好地理解这些概念,避免在实际开发中遇到类似问题时手足无措。