Skip to content

大文件上传如何处理

专题简介

  • 大文件上传问题分析
  • 大文件上传处理方案
  • 差异性
  • 总结

大文件上传问题分析

文件上传简单,文件变大就复杂,在前端上传大文件时,常常会遇到一些限制,例如浏览器的内存限制、网络传输过程中的中断等。 上传大文件时,以下几个变量会影响我们的用户体验

  • 服务器处理数据的能力
  • 请求超时
  • 网络波动 上传时间会变长,高频次文件上传失败,失败后又需要重新上传等等 为了解决上述问题,我们需要对大文件上传单独处理

大文件上传处理方案

为了解决上面客户体验的问题,大文件上传进行了单独的处理,处理方案如下

分片上传

就是将所要上传的文件,按照一定的大小,将整个文件分隔成多个数据块(我们称之为Part)来进行分别上传,上传完之后再由服务端对所有上传的文件进行汇总整合成原始的文件。分片上传不仅可以避免因网络环境不好导致的一直需要从文件起始位置还是上传的问题,还能使用多线程对不同分块数据进行并发发送,提高发送效率,降低发送时间

适应场景

  • 网络环境不好:当出现上传失败的时候,可以对失败的Part进行独立的重试,而不需要重新上传其他的Part。
  • 断点续传:中途暂停之后,可以从上次上传完成的Part的位置继续上传。
  • 加速上传:要上传到OSS的本地文件很大的时候,可以并行上传多个Part以加快上传。
  • 流式上传:可以在需要上传的文件大小还不确定的情况下开始上传。这种场景在视频监控等行业应用中比较常见。
  • 文件较大:一般文件比较大时,默认情况下一般都会采用分片上传。

大致流程

  • 将需要上传的文件按照一定的分割规则,分割成相同大小的数据块;
  • 初始化一个分片上传任务,返回本次分片上传唯一标识;
  • 按照一定的策略(串行或并行)发送各个分片数据块;
  • 发送完成后,服务端根据判断数据上传是否完整,如果完整,则进行数据块合成得到原始文件

断点续传

由于分片上传的数据是永久性的,因此可以很容易的基于分片上传来实现断点续传。

什么是断点续传

断点续传指的是在下载或上传时,将下载或上传任务人为的划分为几个部分

每一个部分采用一个线程进行上传或下载,如果碰到网络故障,可以从已经上传或下载的部分开始继续上传下载未完成的部分,而没有必要从头开始上传下载。用户可以节省时间,提高速度

为什么需要断点续传

在分片上传的过程中,如果因为系统崩溃或者网络中断等异常因素导致上传中断,这时候客户端需要记录上传的进度。在之后支持再次上传时,可以继续从上次上传中断的地方进行继续上传。

为了避免客户端在上传之后的进度数据被删除而导致重新开始从头上传的问题,服务端也可以提供相应的接口便于客户端对已经上传的分片数据进行查询,从而使客户端知道已经上传的分片数据,从而从下一个分片数据开始继续上传。

实现方式

  • 服务器端返回,告知从哪开始
  • 浏览器端自行处理

大致流程

  • 将文件分成若干个小块。
  • 对于每一块,单独上传。
  • 服务器端收到请求后,将分片写入文件。
  • 当所有分片都上传完成后,服务器端拼接所有分片,生成完整的文件。
  • 注意,分片上传通常需要在服务器端配合使用,即服务器端需要支持将分片写入文件和拼接分片的功能。

分片上传和断点续传区别

相同点

  • 都是解决大文件上传优化客户体验
  • 都基于把数据切分成小块,并结合特殊技术来处理

区别

  • 分片上传:将一个大文件切分为多个小文件进行上传。这种方式能够加快上传速度,降低服务器压力,特别适用于大型文件的上传。例如,在云存储系统中,用户可以通过分片上传来上传大型视频、音频文件等。

  • 断点续传:指在上传或下载过程中发生网络中断时,恢复传输时从上次中断的位置继续传输,而不必重新开始。这种方式可以节约时间和流量,提高网络的可靠性。例如,在网盘系统中,用户可以通过断点续传功能,避免文件上传或下载出现错误后需要重新从头开始的情况。

总结

虽然分片上传和断点续传都基于把数据切分成小块,并结合特殊技术来处理,但是它们的应用场景略有不同。分片上传针对的是单个大文件的上传,而断点续传主要用于文件传输中的断点续传,满足用户在大文件上传/下载的过程中,网络出现异常时能够恢复上传或下载任务,节约时间和流量。

参考链接:https://blog.csdn.net/majinggogogo/article/details/87890142