news 2026/5/1 10:31:53

SpringBoot大文件上传如何做到断点续传?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SpringBoot大文件上传如何做到断点续传?

大文件传输系统建设方案

一、项目背景与需求分析

作为山西某大型国企上市公司的项目负责人,我司目前承担着集团级大文件传输平台建设任务。客户群体涵盖部委、政府部门及大型央企,对系统安全性、稳定性及兼容性提出严苛要求。经详细调研,核心需求如下:

(一)功能需求

  1. 大文件传输:支持单文件100GB级传输,含文件夹上传/下载(保留层级结构)
  2. 断点续传:需突破浏览器限制,实现跨会话进度持久化(含IE8兼容)
  3. 安全体系
    • 传输加密:SM4/AES双算法支持
    • 存储加密:透明加密机制
    • 信创适配:全栈国产化环境支持
  4. 性能指标
    • 下载速度≥50MB/s(100G文件)
    • 并发处理能力≥1000用户

(二)技术约束

  1. 开发环境
    • 后端:SpringBoot 2.7.x
    • 前端:Vue2 CLI(需兼容JSP/.NET WebForm)
    • 数据库:Oracle/达梦/人大金仓动态配置
  2. 部署环境
    • 操作系统:Windows7(IE8)/统信UOS/银河麒麟
    • 云存储:华为OBS(混合云动态配置)
  3. 合规要求
    • 信创认证:通过党政机关采购名录
    • 源代码授权:预算≤160万(集团永久使用)

二、技术方案设计

(一)系统架构

信创环境

用户终端

Web安全网关

传输服务集群

华为OBS存储

数据库集群

日志审计系统

国产化存储加速

达梦数据库

(二)核心模块实现

1. 前端实现(Vue2 + WebSocket)
// file-uploader.vue 核心片段exportdefault{data(){return{chunkSize:10*1024*1024,// 10MB分片ws:null,progressMap:newMap()// 持久化进度存储}},methods:{// 初始化WebSocket连接(兼容IE8)initWebSocket(fileId){if(window.WebSocket){this.ws=newWebSocket(`wss://${location.host}/ws/upload/${fileId}`);}elseif(window.MozWebSocket){this.ws=newMozWebSocket(`wss://${location.host}/ws/upload/${fileId}`);}else{// IE8降级方案this.fallbackUpload(fileId);return;}this.ws.onmessage=(e)=>{constdata=JSON.parse(e.data);if(data.type==='progress'){this.progressMap.set(data.chunkId,data.percent);this.saveProgressToLocalStorage();}};},// 本地存储进度(兼容IE8)saveProgressToLocalStorage(){try{if(window.localStorage){localStorage.setItem('uploadProgress',JSON.stringify(Array.from(this.progressMap)));}else{// IE8使用userData存储constuserData=document.createElement('input');userData.addBehavior('#default#userData');userData.setAttribute('uploadProgress',JSON.stringify(Array.from(this.progressMap)));userData.save('FileUploadData');}}catch(e){console.error('Progress save failed:',e);}},// 文件分片上传(支持文件夹)asyncuploadFile(file,path=''){constfileId=this.generateFileId(file);consttotalChunks=Math.ceil(file.size/this.chunkSize);// 从本地恢复进度this.loadProgressFromLocalStorage(fileId);for(leti=0;i<totalChunks;i++){if(this.progressMap.has(`${fileId}-${i}`))continue;constchunk=file.slice(i*this.chunkSize,(i+1)*this.chunkSize);constformData=newFormData();formData.append('file',chunk);formData.append('chunkIndex',i);formData.append('totalChunks',totalChunks);formData.append('relativePath',path);try{awaitaxios.post(`/api/upload/${fileId}`,formData,{headers:{'X-Encryption-Type':'SM4'// 加密标识},onUploadProgress:(progressEvent)=>{constpercent=Math.round((progressEvent.loaded*100)/progressEvent.total);this.progressMap.set(`${fileId}-${i}`,percent);this.saveProgressToLocalStorage();}});}catch(e){console.error(`Chunk${i}upload failed`,e);throwe;}}// 通知服务端合并文件awaitaxios.post('/api/merge',{fileId,fileName:file.name,relativePath:path});},// 文件夹上传(递归处理)asyncuploadFolder(folderEntry,currentPath=''){constreader=folderEntry.createReader();constentries=awaitnewPromise((resolve)=>{reader.readEntries(resolve);});for(constentryofentries){if(entry.isFile){constfile=awaitnewPromise((resolve)=>{entry.file(resolve);});awaitthis.uploadFile(file,`${currentPath}/${entry.name}`);}elseif(entry.isDirectory){awaitthis.uploadFolder(entry,`${currentPath}/${entry.name}`);}}}}}
2. 后端实现(SpringBoot)
// FileUploadController.java 核心片段@RestController@RequestMapping("/api")publicclassFileUploadController{@AutowiredprivateFileStorageServicestorageService;@AutowiredprivateEncryptionServiceencryptionService;// 文件分片上传@PostMapping("/upload/{fileId}")publicResponseEntity>uploadChunk(@PathVariableStringfileId,@RequestParam("file")MultipartFilefile,@RequestParamintchunkIndex,@RequestParaminttotalChunks,@RequestHeader("X-Encryption-Type")StringencryptionType){try{// 1. 解密处理byte[]decryptedData;if("SM4".equals(encryptionType)){decryptedData=encryptionService.sm4Decrypt(file.getBytes());}else{decryptedData=encryptionService.aesDecrypt(file.getBytes());}// 2. 存储分片StringchunkPath=storageService.storeChunk(fileId,chunkIndex,decryptedData,totalChunks);// 3. 返回进度信息Mapresponse=newHashMap<>();response.put("chunkIndex",chunkIndex);response.put("status","SUCCESS");returnResponseEntity.ok(response);}catch(Exceptione){returnResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(Collections.singletonMap("error",e.getMessage()));}}// 合并文件@PostMapping("/merge")publicResponseEntitymergeFile(@RequestBodyMergeRequestrequest){try{// 验证所有分片是否存在if(!storageService.allChunksExist(request.getFileId(),request.getTotalChunks())){returnResponseEntity.badRequest().body("Missing chunks");}// 合并文件StringfinalPath=storageService.mergeFile(request.getFileId(),request.getFileName(),request.getRelativePath());// 返回下载URLreturnResponseEntity.ok(finalPath);}catch(Exceptione){returnResponseEntity.internalServerError().body(e.getMessage());}}// WebSocket进度推送(IE8降级方案)@GetMapping("/ws/upload/{fileId}")publicWebSocketHandlerhandleWebSocket(@PathVariableStringfileId){returnsession->{// 实现自定义业务逻辑};}}
3. 信创适配层
// 国密加密实现publicclassSM4EncryptionServiceimplementsEncryptionService{privatestaticfinalStringSM4_KEY="your-32-byte-sm4-key";// 实际应从安全配置读取@Overridepublicbyte[]encrypt(byte[]data)throwsException{SM4Engineengine=newSM4Engine();PaddedBufferedBlockCiphercipher=newPaddedBufferedBlockCipher(newCBCBlockCipher(engine),newPKCS7Padding());byte[]keyBytes=SM4_KEY.getBytes(StandardCharsets.UTF_8);byte[]iv=newbyte[engine.getBlockSize()];// 实际应从安全配置读取cipher.init(true,newParametersWithIV(newKeyParameter(keyBytes),iv));byte[]output=newbyte[cipher.getOutputSize(data.length)];intlen=cipher.processBytes(data,0,data.length,output,0);len+=cipher.doFinal(output,len);returnArrays.copyOf(output,len);}@Overridepublicbyte[]decrypt(byte[]encryptedData)throwsException{// 实现解密逻辑(与encrypt对称)// ...}}

三、供应商选型建议

基于集团需求,建议从以下维度评估供应商:

(一)资质要求

  1. 信创认证

    • 党政机关采购名录入围证明
    • 国产操作系统兼容性认证(统信UOS/麒麟等)
    • 国产数据库适配认证(达梦/人大金仓)
  2. 安全资质

    • 等保三级认证
    • 国密算法实现合规证明
    • 源代码安全审计报告

(二)技术能力

  1. 核心功能

    • 必须提供文件夹层级结构传输实现
    • 需展示IE8兼容性测试报告
    • 需提供100G文件传输压力测试报告
  2. 开发支持

    • 提供完整的SpringBoot集成示例
    • 支持Vue2/JSP/.NET WebForm多前端框架
    • 提供信创环境部署手册

(三)商务条款

  1. 授权模式

    • 永久源代码授权(集团内无限使用)
    • 包含5年免费升级服务
    • 提供源码同步更新机制
  2. 成功案例

    • 至少3个央企/部委级案例
    • 提供合同关键页复印件
    • 提供客户联系方式供实地考察

四、实施路线图

阶段周期交付物
需求确认2周详细需求规格说明书
技术选型3周供应商评估报告
原型开发4周可运行演示系统
信创适配6周全栈国产化环境验证
试点部署2周客户现场压力测试
全面推广持续集团级部署手册

五、风险控制

  1. 技术风险

    • 建立双开发团队(自研+供应商)
    • 要求供应商提供7×24小时技术支持
    • 预留20%预算用于技术攻关
  2. 合规风险

    • 引入第三方安全审计
    • 关键代码段进行混淆处理
    • 建立源代码版本追溯机制
  3. 商务风险

    • 分阶段付款(30%-40%-30%)
    • 明确违约赔偿条款
    • 要求供应商提供银行履约保函

本方案已充分考虑政府客户特有的安全合规要求,通过分层架构设计实现技术解耦,确保系统既能满足当前需求,又具备未来5年的技术演进能力。建议尽快启动供应商评估流程,确保在Q3前完成试点部署。

SQL示例

创建数据库

配置数据库连接

自动下载maven依赖

启动项目

启动成功

访问及测试

默认页面接口定义

在浏览器中访问

数据表中的数据

效果预览

文件上传

文件刷新续传

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

文件夹上传

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

批量下载

支持文件批量下载

下载续传

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

文件夹下载

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

示例下载

下载完整示例

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

http协议下SpringMVC如何高效上传大文件?

项目技术方案&#xff1a;大文件传输系统&#xff08;企业级高可用方案&#xff09; 编制&#xff1a;北京某互联网企业 前端研发部 - 张工 日期&#xff1a;2023年11月28日 一、项目背景与核心痛点 公司承接政府/军工领域项目&#xff0c;需开发50GB级文件传输系统&#xff0…

作者头像 李华
网站建设 2026/5/1 4:27:20

AI学习01--WSL 显卡直通

安装wsl ubuntu 这里就不多说了&#xff0c;都一样 显卡直通 安装 CUDA 工具包&#xff08;仅工具链&#xff0c;不含驱动&#xff09; #下载 NVIDIA 官方的 CUDA 密钥环包 wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-keyring_1.1…

作者头像 李华
网站建设 2026/5/1 4:23:42

电脑系统打开软件提示缺少mfc100.dll文件 免费下载方法

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

作者头像 李华
网站建设 2026/5/1 4:29:11

交叉引用两个或者多个文献,用-和,

参考视频&#xff1a; https://www.bilibili.com/video/BV1TN411Z7Ex/?spm_id_from333.337.search-card.all.click&vd_sourceaedd69dc9740e91cdd85c0dfaf25304b 选中后shiftf9, 变成 在所有的\h后加 #"[0]" 此时&#xff0c;如果想

作者头像 李华
网站建设 2026/5/1 5:24:21

好写作AI:当你的论文需要“英美思维体验卡”时,AI能做什么?

你的英语论文每个单词都对&#xff0c;但导师说“读起来很别扭”——这可能不是语法问题&#xff0c;而是你的大脑在偷偷进行“中式英语思维”的实况转播。 许多用英语撰写学术论文的研究者都经历过这种“跨文化尴尬”&#xff1a;你的研究思路明明很创新&#xff0c;数据分析也…

作者头像 李华
网站建设 2026/5/1 5:27:13

收藏备用!Java程序员转行AI大模型:避坑指南+落地路径

在AI大模型技术全面渗透各行各业的今天&#xff0c;“AI”已成为企业数字化转型的核心范式。从智能代码生成、自动化测试到企业级知识库搭建、智能决策辅助&#xff0c;大模型正深刻改变着技术研发与业务落地的模式&#xff0c;也为传统程序员提供了全新的职业赛道。 对于长期…

作者头像 李华