一、背景
系统中存在500M+的音频文件上传
基于客户端网络的不确定、不可控性,大文件分片并发上传、MD5秒传是有必要引入的
二、技术选型
Web Uploader
Spring Boot
redis
三、数据结构
服务端接收对象
redis数据结构
- HASH
- key:FILE_UPLOAD_STATUS
- hashKey:68af75938175f1726afb1d9df90753fd
- value:true
- String
- key:FILE_MD5:68af75938175f1726afb1d9df90753fd
- value:D: /data0/uploads/68af75938175f1726afb1d9df90753fd/思考的乐趣.pdf 或者 D: /data0/uploads/68af75938175f1726afb1d9df90753fd/思考的乐趣.pdf.conf(记录各片段上传情况)
文件目录结构
四、实现细节
- beforeSendFile:uploader.md5File(file)
- 及时显示进度
- 完成
- index/checkFileMd5
- stringRedisTemplate.opsForHash().get(Constants.FILE_UPLOAD_STATUS, md5);
- null:该文件没有上传过。
- true:文件已存在!
- stringRedisTemplate.opsForValue().get(Constants.FILE_MD5_KEY + md5);返回给前端
- false:该文件上传了一部分。
- String value = stringRedisTemplate.opsForValue().get(Constants.FILE_MD5_KEY + md5);
- byte[] completeList = FileUtils.readFileToByteArray(new File(value))
- List<String> missChunkList <= completeList 返回给前端
- file.missChunks = data.data;(部分已经上传到服务器了,但是差几个模块。)
- stringRedisTemplate.opsForHash().get(Constants.FILE_UPLOAD_STATUS, md5);
- index/checkFileMd5
- beforeSend:依据missChunks决定是task.reject()还是task.resolve()
- uploader.upload():index/fileUpload
- 上传,依据偏移量写临时文件
- 修改本片段上传状态完成,检查是否全部上传完毕
- 全部上传完毕重命名文件
五、Q&A
- 文件在JS中的数据结构以及如何分片?每片大小如何设置?
- 并发上传是如何实现的?并发数如何设置?
- 现有方案采用何种逻辑实现文件写磁盘?有优化空间吗?
六、参考资料
- Web Uploader官网(http://fex.baidu.com/webuploader/)
- breakpoint-http码云地址(https://gitee.com/Fourwenwen/breakpoint-http)
- https://www.javascripture.com/Blob
- https://www.javascripture.com/File
- js中关于Blob对象的介绍与使用(https://www.cnblogs.com/wangfajing/p/7202139.html?utm_source=itdadao&utm_medium=referral)
- jQuery的deferred对象详解(http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html)
- JavaScript 异步编程之 jsdeferred 原理解析(https://segmentfault.com/a/1190000007216755)
- Java NIO写大文件比较(https://my.oschina.net/feichexia/blog/212318)
- 深入浅出MappedByteBuffer(https://www.jianshu.com/p/f90866dcbffc)
技术债
- Java NIO的深入理解
- JQuery deferred的深入理解
- 文件服务器设计思路
相关推荐
**并发上传**:并发上传是指同时上传多个文件片或者多个文件,利用多线程或异步处理,充分利用网络带宽。Webuploader支持并发上传,可以设置并发上传的数量,这样可以在不增加服务器压力的情况下最大化上传效率。 *...
- **并发上传**:为了进一步提高效率,可以并行上传不同的分片,利用多线程或多进程技术。 - **断点续传**:如果上传中断,系统应能识别已上传的分片,从而在下次尝试时从断点处继续上传,避免重新上传所有分片。 ...
springboot 大文件上传,支持分片并发上传、断点续传、秒传,已经测试过1.2G的文件,最大支持理论无限制 博文链接:https://blog.csdn.net/haohao123nana/article/details/54692669
在IT行业中,大文件分片上传是一项常见的技术需求,尤其在云存储、文件分享和协作平台等场景下。本文将详细解析如何轻松实现超大文件的分片上传,并讨论相关的关键知识点。 首先,理解“分片上传”的概念是至关重要...
3. **大文件分片上传**:为了处理大文件(如GB级别的文件),项目采用了分片上传策略。文件被分割成多个小块(通常几百KB或几MB),每个块单独上传,这样可以提高上传速度并降低网络问题的影响。同时,分片上传也...
这种方法可以提高上传速度,因为每个小片都可以并发上传,同时允许在网络不稳定时只重新上传失败的片,而不是整个文件。 HTML文件在这个过程中主要负责用户界面的设计和交互。用户通常会有一个提交按钮来启动上传...
- 并行上传:前端可以并发上传不同的分片,提高上传速度。 - 断点续传:保存上传进度,如果上传中断,可以从上次断点继续,而不是重新开始。 - 负载均衡:对于高并发场景,可以考虑使用负载均衡策略,将不同分片...
在项目中,我们可以通过配置这个组件,设置每片的大小、并发上传的分片数量以及如何处理每个分片的上传状态。 在后端,我们可以集成fastdfs或Minio这样的文件存储系统。FastDFS是一个开源的、轻量级的分布式文件...
大文件分片上传的基本思路是将大文件分割成多个小块(通常称为“片”或“块”),然后逐个上传这些小块,最后在服务器端将这些块重新组合成原始文件。这个过程包括以下几个关键步骤: 1. **文件分片**:首先,我们...
本项目"基于webuploader的asp.net大文件分片上传"实现了利用WebUploader与ASP.NET后台服务协同工作,通过将大文件切割为小块(通常称为“分片”或“块”),逐个上传到服务器,最后在服务器端进行重组,从而实现大...
本项目"java实现大文件上传分片上传断点续传.zip"提供了一个基于SpringBoot框架的解决方案,它实现了大文件的分片上传和断点续传功能。以下是关于这个项目的关键知识点的详细说明: 1. **大文件上传**: - 大文件...
前端则可以通过调整并发上传的文件片数量,平衡网络带宽和服务器资源的占用。 7. **错误处理和异常恢复**:在设计系统时,应考虑到可能出现的各种错误情况,如网络波动、服务器故障等。确保有良好的错误处理机制,...
这个技术通过将大文件分割成多个小块(分片)来上传,提高了上传的稳定性和效率。下面我们将详细讨论这个知识点。 **1. 文件分片上传原理** 文件分片上传的基本思想是将大文件切割成若干个小片段,每个片段独立...
分片上传可以提高上传速度,因为多块可以并发上传,还可以减少因单个大文件上传失败而造成的重试成本。在ASP.NET中,可以使用第三方库如jQuery.FileUpload或WebUploader等来实现这一功能。 3. **并发上传**:并发...
"WebUploader"是一个强大的前端文件上传组件,它巧妙地解决了这些问题,通过大文件分片上传和并发处理,使得上传过程更加高效和稳定。 首先,我们来详细了解一下**大文件分片上传**的概念。大文件分片上传是将一个...
为了实现大文件分片上传,WebUploader 提供了并发分片功能,提高上传效率。在上传前,WebUploader 会对每个文件计算 MD5 值,用于检查文件的完整性。在后台,我们可以利用这些 MD5 值来判断文件是否已经存在于服务器...
本示例主要讨论的是如何通过浏览器端对大文件进行分片处理,并利用百度云的对象存储服务BOS(Baidu Cloud Storage Object Storage)实现无服务器介入的直接上传,同时提供上传进度条功能。 首先,我们来详细了解...