news 2026/4/3 5:04:31

SpringBoot视频文件分块上传的优化策略讨论

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SpringBoot视频文件分块上传的优化策略讨论

大文件传输系统技术方案调研与实现建议

一、项目背景与需求分析

作为公司前端技术负责人,我负责牵头本次大文件传输系统的技术选型与实现方案。基于客户(政府及集团单位)的严格要求,系统需满足以下核心需求:

  1. 功能需求

    • 支持50GB级大文件/文件夹上传下载
    • 完整的断点续传功能(支持浏览器刷新/关闭后恢复)
    • 保持文件夹层级结构
    • 支持SM4/AES双加密方案
  2. 兼容性需求

    • 浏览器兼容:IE8+及国产浏览器(龙芯、红莲花、奇安信)
    • 操作系统兼容:Windows 7+IE8、统信UOS、中标麒麟、银河麒麟
    • 数据库兼容:SQL Server/MySQL/Oracle/达梦/人大金仓
  3. 安全需求

    • 传输加密(TLS 1.2+)
    • 存储加密(SM4/AES可配置)
    • 完全私有化部署
  4. 商务需求

    • 预算80-140万采购源代码
    • 需获得完整知识产权
    • 支持公司2000+项目复用

二、技术选型分析

2.1 开源方案评估

经调研,主流开源方案存在以下问题:

  • WebUploader:已停更,IE8支持不完善
  • Plupload:商业使用需授权,无国产加密支持
  • Uppy:现代浏览器支持好,但IE8不兼容
  • Resumable.js:功能单一,无文件夹支持

2.2 自研方案建议

基于项目需求,建议采用自研核心+成熟组件集成的方案:

  1. 前端架构

    • Vue2 CLI框架(兼容IE8需配置babel-polyfill)
    • 分片上传核心库(自研)
    • 文件夹解析模块(基于FileSystemAPI+递归算法)
    • 加密模块(集成Web Crypto API+SM4 polyfill)
  2. 后端架构

    • SpringBoot 2.x
    • 分片存储服务
    • 加密服务模块
    • 进度持久化服务

三、核心功能实现方案

3.1 前端实现(Vue2示例)

3.1.1 文件分片处理
// file-chunker.jsexportdefaultclassFileChunker{constructor(file,chunkSize=5*1024*1024){this.file=file;this.chunkSize=chunkSize;this.chunks=[];this.initChunks();}initChunks(){consttotalChunks=Math.ceil(this.file.size/this.chunkSize);for(leti=0;i<totalChunks;i++){conststart=i*this.chunkSize;constend=Math.min(start+this.chunkSize,this.file.size);this.chunks.push({index:i,start,end,blob:this.file.slice(start,end)});}}// 生成文件唯一标识(基于内容+名称+大小)generateFileId(){returnthis.file.name+this.file.size+this.file.lastModified;}}
3.1.2 断点续传实现
// upload-manager.jsimportFileChunkerfrom'./file-chunker';importCryptoServicefrom'./crypto-service';exportdefaultclassUploadManager{constructor(apiUrl){this.apiUrl=apiUrl;this.crypto=newCryptoService();this.progressStore=this.initProgressStore();}initProgressStore(){// 使用localStorage+IndexedDB双存储方案conststore={get(fileId){try{constdata=localStorage.getItem(`upload_${fileId}`);returndata?JSON.parse(data):null;}catch(e){returnnull;}},set(fileId,progress){try{localStorage.setItem(`upload_${fileId}`,JSON.stringify(progress));// 同步到IndexedDB(代码省略)}catch(e){console.error('Progress store error:',e);}}};returnstore;}asyncuploadFile(file){constfileChunker=newFileChunker(file);constfileId=fileChunker.generateFileId();constexistingProgress=this.progressStore.get(fileId);// 从断点继续letstartChunk=0;if(existingProgress){startChunk=existingProgress.completedChunks;}for(leti=startChunk;i<fileChunker.chunks.length;i++){constchunk=fileChunker.chunks[i];constformData=newFormData();// 加密分片数据constencryptedData=awaitthis.crypto.encrypt(chunk.blob);formData.append('file',encryptedData,`chunk_${chunk.index}`);formData.append('fileId',fileId);formData.append('chunkIndex',chunk.index);formData.append('totalChunks',fileChunker.chunks.length);try{awaitaxios.post(`${this.apiUrl}/upload`,formData,{onUploadProgress:(progressEvent)=>{// 更新进度存储constprogress={completedChunks:i,totalChunks:fileChunker.chunks.length,uploadedBytes:progressEvent.loaded,totalBytes:progressEvent.total};this.progressStore.set(fileId,progress);}});}catch(error){console.error(`Chunk${i}upload failed:`,error);throwerror;// 可以根据需求实现重试机制}}// 上传完成通知awaitthis.notifyComplete(fileId);return{success:true,fileId};}}
3.1.3 IE8兼容性处理
// ie-polyfill.js// 基础兼容处理import'babel-polyfill';import'core-js/features/promise';import'core-js/features/array/from';import'core-js/features/object/assign';// 自定义事件兼容if(!window.CustomEvent){window.CustomEvent=function(event,params){params=params||{bubbles:false,cancelable:false,detail:undefined};constevt=document.createEvent('CustomEvent');evt.initCustomEvent(event,params.bubbles,params.cancelable,params.detail);returnevt;};window.CustomEvent.prototype=window.Event.prototype;}// XMLHttpRequest兼容增强constoriginalOpen=XMLHttpRequest.prototype.open;XMLHttpRequest.prototype.open=function(method,url){// IE8 URL处理if(window.XDomainRequest&&!window.XMLHttpRequest.prototype.withCredentials){// 降级处理逻辑(代码省略)}originalOpen.apply(this,arguments);};

3.2 后端实现(SpringBoot示例)

3.2.1 分片上传控制器
@RestController@RequestMapping("/api/upload")publicclassUploadController{@AutowiredprivateChunkStorageServicechunkStorageService;@AutowiredprivateProgressServiceprogressService;@PostMappingpublicResponseEntityuploadChunk(@RequestParam("file")MultipartFilefile,@RequestParam("fileId")StringfileId,@RequestParam("chunkIndex")intchunkIndex,@RequestParam("totalChunks")inttotalChunks){try{// 1. 存储分片数据chunkStorageService.saveChunk(fileId,chunkIndex,file.getBytes());// 2. 更新进度信息progressService.updateProgress(fileId,chunkIndex,totalChunks);returnResponseEntity.ok(newUploadResponse(true,"Chunk uploaded successfully"));}catch(Exceptione){returnResponseEntity.status(500).body(newUploadResponse(false,"Upload failed: "+e.getMessage()));}}@GetMapping("/progress")publicResponseEntitygetProgress(@RequestParamStringfileId){ProgressInfoprogress=progressService.getProgress(fileId);returnResponseEntity.ok(progress);}@PostMapping("/merge")publicResponseEntitymergeFile(@RequestBodyMergeRequestrequest){try{// 合并分片逻辑(代码省略)StringfilePath=chunkStorageService.mergeChunks(request.getFileId(),request.getFileName());// 解密存储(根据配置使用SM4/AES)cryptoService.decryptAndStore(filePath,request.getEncryptionType());returnResponseEntity.ok(newMergeResponse(true,filePath));}catch(Exceptione){returnResponseEntity.status(500).body(newMergeResponse(false,"Merge failed: "+e.getMessage()));}}}
3.2.2 进度持久化服务
@ServicepublicclassProgressServiceImplimplementsProgressService{@AutowiredprivateProgressRepositoryprogressRepository;@OverridepublicvoidupdateProgress(StringfileId,intcompletedChunks,inttotalChunks){Optionalexisting=progressRepository.findById(fileId);UploadProgressprogress=existing.orElseGet(()->{UploadProgressnewProgress=newUploadProgress();newProgress.setFileId(fileId);returnnewProgress;});progress.setCompletedChunks(completedChunks);progress.setTotalChunks(totalChunks);progress.setLastUpdated(newDate());progressRepository.save(progress);}@OverridepublicProgressInfogetProgress(StringfileId){OptionalprogressOpt=progressRepository.findById(fileId);returnprogressOpt.map(p->newProgressInfo(p.getFileId(),p.getCompletedChunks(),p.getTotalChunks(),calculatePercentage(p.getCompletedChunks(),p.getTotalChunks()))).orElse(null);}privatedoublecalculatePercentage(intcompleted,inttotal){returntotal>0?((double)completed/total)*100:0;}}

四、国产化适配方案

4.1 信创浏览器兼容

  1. 龙芯浏览器

    • 基于Chromium内核,兼容现代Web标准
    • 需测试SM4加密性能
  2. 红莲花浏览器

    • 360安全浏览器信创版
    • 需配置兼容模式列表
  3. 奇安信浏览器

    • 支持国密算法原生实现
    • 需测试文件API兼容性

4.2 操作系统适配

  1. 统信UOS/中标麒麟/银河麒麟

    • 使用Electron封装提供统一体验
    • 测试本地文件系统访问权限
  2. Windows 7+IE8

    • 完整polyfill方案
    • 禁用部分现代API(如FileSystemAPI)

4.3 数据库适配

// 动态数据源配置示例@ConfigurationpublicclassDataSourceConfig{@Bean@Primary@ConfigurationProperties(prefix="spring.datasource.mysql")publicDataSourcemysqlDataSource(){returnDataSourceBuilder.create().build();}@Bean@ConfigurationProperties(prefix="spring.datasource.oracle")publicDataSourceoracleDataSource(){returnDataSourceBuilder.create().build();}@Bean@ConfigurationProperties(prefix="spring.datasource.dameng")publicDataSourcedamengDataSource(){returnDataSourceBuilder.create().build();}// 其他数据源...}

五、安全实施方案

5.1 传输安全

  1. 强制TLS 1.2+
  2. 前端加密(SM4/AES)
  3. 敏感数据脱敏处理

5.2 存储安全

// 加密存储服务示例@ServicepublicclassCryptoStorageService{@Value("${crypto.algorithm:SM4}")// 默认使用SM4privateStringcryptoAlgorithm;publicvoidencryptAndStore(StringfilePath,byte[]data){try{byte[]encryptedData;if("SM4".equalsIgnoreCase(cryptoAlgorithm)){encryptedData=sm4Encrypt(data);}else{encryptedData=aesEncrypt(data);}Files.write(Paths.get(filePath),encryptedData);}catch(Exceptione){thrownewCryptoException("Encryption failed",e);}}privatebyte[]sm4Encrypt(byte[]data){// SM4加密实现(使用BouncyCastle等库)// 代码省略...}privatebyte[]aesEncrypt(byte[]data){// AES加密实现// 代码省略...}}

六、实施路线图

  1. 第一阶段(1个月)

    • 完成核心分片上传下载功能
    • 实现IE8基础兼容
    • 搭建测试环境
  2. 第二阶段(1.5个月)

    • 完善断点续传机制
    • 实现文件夹层级结构支持
    • 完成国产化环境适配
  3. 第三阶段(1个月)

    • 实现加密传输存储
    • 完成与现有系统集成
    • 压力测试与优化
  4. 第四阶段(0.5个月)

    • 文档编写
    • 内部培训
    • 部署上线

七、预算与采购建议

基于项目需求,建议采购方案:

  1. 源代码授权

    • 预算范围:80-140
    • 授权范围:公司全系列产品永久使用
    • 交付内容:完整源代码+文档+3年技术支持
  2. 替代方案

    • 核心模块自研+非核心模块采购
    • 预算可控制在60-100
  3. 风险控制

    • 要求供应商提供信创环境测试报告
    • 签订保密协议
    • 分阶段付款(30%-40%-30%)

八、结论

本方案通过自研核心上传下载引擎,结合成熟加密和存储方案,能够全面满足客户的大文件传输需求。建议尽快启动技术预研,与国产软硬件厂商建立合作,确保在信创环境下的兼容性。同时,建议组建专门的项目组,包括前端、后端、测试和安全专家,确保项目按时高质量交付。

SQL示例

创建数据库

配置数据库连接

自动下载maven依赖

启动项目

启动成功

访问及测试

默认页面接口定义

在浏览器中访问

数据表中的数据

效果预览

文件上传

文件刷新续传

支持离线保存文件进度,在关闭浏览器,刷新浏览器后进行不丢失,仍然能够继续上传

文件夹上传

支持上传文件夹并保留层级结构,同样支持进度信息离线保存,刷新页面,关闭页面,重启系统不丢失上传进度。

批量下载

支持文件批量下载

下载续传

文件下载支持离线保存进度信息,刷新页面,关闭页面,重启系统均不会丢失进度信息。

文件夹下载

支持下载文件夹,并保留层级结构,不打包,不占用服务器资源。

示例下载

下载完整示例

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/21 0:04:22

vue+uniapp+基于微信小程序的健康管理系统医院挂号预约

文章目录基于微信小程序的健康管理系统&#xff08;VueUniapp&#xff09;主要技术与实现手段系统设计与实现的思路系统设计方法java类核心代码部分展示结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;基于微信小程序的健康管理系统&a…

作者头像 李华
网站建设 2026/3/10 10:17:08

vue+uniapp+基于微信小程序的停车场车辆管理系统_yya74do7--论文

文章目录摘要主要技术与实现手段系统设计与实现的思路系统设计方法java类核心代码部分展示结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;摘要 随着城市化进程加快和机动车保有量激增&#xff0c;停车难问题日益突出。传统停车场管理…

作者头像 李华
网站建设 2026/3/31 5:17:42

开发者福音:腾讯HunyuanOCR提供API和Web双模式推理入口

腾讯HunyuanOCR&#xff1a;轻量端到端模型如何重塑OCR开发体验 在企业数字化转型加速的今天&#xff0c;一张发票、一份合同、一段视频字幕背后&#xff0c;往往隐藏着大量亟待提取的结构化信息。传统OCR方案动辄需要部署多个独立模型——先检测文字位置&#xff0c;再识别内容…

作者头像 李华
网站建设 2026/4/1 16:04:02

基于Three.js可视化场景的文字识别:HunyuanOCR助力3D内容理解

基于Three.js可视化场景的文字识别&#xff1a;HunyuanOCR助力3D内容理解 在数字孪生、虚拟展厅和工业仿真的世界里&#xff0c;我们早已习惯了用Three.js构建出逼真而交互丰富的3D场景。但一个长期被忽视的问题是——这些画面中的文字&#xff0c;机器真的“看得懂”吗&#x…

作者头像 李华
网站建设 2026/3/22 15:04:31

Leetcode 19. 删除链表的倒数第 N 个结点 JavaScript (Day 11)

js一刷自解哈希表 var removeNthFromEnd function(head, n) {let idxnew Map();let curhead;while(cur){idx.set(cur,1);curcur.next;}let keys[...idx.keys()];let tempkeys[keys.length-n];if(keys.length-n0){return temp.next;}let prevkeys[keys.length-n-1];prev.nextte…

作者头像 李华
网站建设 2026/3/29 1:58:54

从GitHub镜像到本地部署:腾讯HunyuanOCR快速上手全记录

从GitHub镜像到本地部署&#xff1a;腾讯HunyuanOCR快速上手全记录 在智能文档处理需求激增的今天&#xff0c;企业对OCR技术的要求早已不再满足于“能识别文字”这么简单。我们真正需要的是一个既能读懂复杂票据、又能理解多语言混合内容&#xff0c;还能在普通GPU上稳定运行…

作者头像 李华