大文件断点续传、快传秒传实现方案

2024-02-03 02:50

本文主要是介绍大文件断点续传、快传秒传实现方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

为什么视频、音频、大型文档等大文件不能也直接上传吗,简单又方便?

遇到手动暂停、网络中断、网络不稳定或者服务端响应超时,当你终于半天到99%,网络突然断开喜提从0%再来一次

再者一次服务接受如此大的数据传输,不说服务器肯同意接收,即使配置同意接受这常常会使服务器出现响应超时或者陷入阻塞。为了解决这些问题,支持断点续传就变得非常必要了

快传、秒传⭐

文件块的上传时计算MD5值,根据MD5去查数据库文件块表,如果存在直接带着查到的记录返回上传成功!!

至于整个大文件是否需要计算MD5来比对数据库文件表,这取决于实际需求来决定。在某些特定场景下,可能需要验证整个大文件的完整性,或者需要将大文件的 MD5 值保存在后端进行后续比对等操作,在这种情况下,就需要计算整个大文件的 MD5 值

(快传、秒传广泛应用于网盘云存储、多平台同步、文件分享和传递、在线备份的场景)

断点续传⭐⭐

将大文件是数据分割为多个相同大小的小片,每个分片带着自己的序号和MD5值独立上传。如果发生事件导致传输中断,下一次传输时重新传输即可,已传输过的分片会根据MD5直接返回传输成功!!

(相同分片大小是为了服务端能够找到该分片在文件写入的起始位置,但是最后一个分片的大小可以小于等于分片大小)

上传流程

这里引入一张较为完整的流程图

细节思路

MD5如何计算 🌙🌙

网上的一种思路MD5(浏览器ID(服务端写在cookie中) + 文件名 + 文件大小 + 文件修改时间 )的格式,进行MD5降重,也避免了MD5计算量大的问题。这种方式适用于个人文件上传的场景,并不适合多平台同步、文件分享传输的场景,因为即使一模一样的两个文件多个用户或者浏览器计算得出的MD5值是不一样的

最好的计算方法是用文件的内容进行MD5计算,但计算量极大,过多的耗时会影响上传的体验,需要尽量控制在MD5计算前限制用户所选文件不能过大

分片的上传方式🌙🌙

先发送一个不携带文件块二进制数据的预检请求,判断文件是否上传完成,分片上传的FormData附带以下参数,序号、总块数、文件ID、分片大小、文件大小、分片的MD5、文件块二进制数据

选择串行还是并发上传,因为js是单线程的无法类似于java线程的方式执行并发上传的任务,但是有一些流行的前端库和框架(如axios、Fetch API、jQuery AJAX等)提供了并发请求的功能,需要注意的是,并发上传可能会对服务器和网络带宽造成一定的负担,对用户体验造成负面影响

分片大小🌙🌙

分片大小的确定一般由前端动态确定,后端还可以根据自身的需求和系统性能,对分片大小进行一定的限制或调整

较大的分片可以提高上传速度,但会增加单个分片上传失败的风险,较小分片可以降低单个分片上传失败的风险,但同时也会提高服务器处理的复杂度

是否需要合并🌙

需要分片合并的场景:服务端每次接收一小片文件保存成一个临时文件,等待所有片段传输完毕后,再执行合并,如果原始文件足够小,只要合理控制分块大小这种方式是可以的,但文件大小达到几百MB或者几个GB,合并文件的时间会非常长,常常导致浏览器响应超时或服务器阻塞,而且服务端会额外多占用一倍的存储空间

如果是每收到分片文件就在文件内指定偏移位置写入的方案,并不需要额外空间保存文件分块,也不需要在上传结束后进行分块的合并

前后端核心方法🌙🌙

JS文件分片的核心方法,   File的slice() 

JAVA写入分片的核心方法, RandomAccessFile的write()  /  MappedByteBuffer的write() 

RandomAccessFile和MapperdByteBuffer都能实现对文件任意位置的读取和写入数据,适用于大文件的读写尤其是频繁读写场景。

两者的不同在于

  • 前者是Java IO提供的类,读写过程中seek()能指定跳转到不同位置,实现随机访问;
  • 后者是Java NIO提供的类,使用内存映射文件的方式将文件的一部分映射到内存中进行读写,这种方式避免传统的IO磁盘操作直接调用系统底层的缓存,没有JVM和系统之间的复制操作,所以效率非常高

代码实现

浏览器端(B/S的B)

  • vue项目实现

npm下载md5工具和vue-upload文件上传插件

  • html的实现

引入一个md5工具

Java客户端(C/S的C)

提供一个文件分割与合并的工具类,使用线程池技术,速度很快

Java服务端(C/S或B/S的S)

提供一个文件分割与合并的工具类,使用线程池技术,速度很快

SpringBoot中普通文件上传存储代码见上篇博客:SpringBoot文件上传存储解决方案_springboot 文件存储-CSDN博客使用Spring Boot框架实现一个完善的文件上传功能,在Spring Boot中配置文件上传的方法,并提供了详细的代码说明。通过学习本文,你将获得实战经验,能够快速应用文件上传功能在自己的项目中。如果你对Spring Boot文件上传感兴趣,那么这篇文章将为你提供一套较为完善的解决方案,助你快速搭建和应用文件上传功能,并且具备很大的扩展性。_springboot 文件存储https://blog.csdn.net/util123/article/details/131786587?spm=1001.2014.3001.5502

代码资源自取,学习用

这篇关于大文件断点续传、快传秒传实现方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/672780

相关文章

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

PyCharm中配置PyQt的实现步骤

《PyCharm中配置PyQt的实现步骤》PyCharm是JetBrains推出的一款强大的PythonIDE,结合PyQt可以进行pythion高效开发桌面GUI应用程序,本文就来介绍一下PyCha... 目录1. 安装China编程PyQt1.PyQt 核心组件2. 基础 PyQt 应用程序结构3. 使用 Q