news 2026/1/19 8:41:18

SpringBoot如何实现百万文件夹上传的目录结构保持

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SpringBoot如何实现百万文件夹上传的目录结构保持

大文件传输解决方案(源码级实现)

作为集团项目负责人,我深度理解当前大文件传输需求的复杂性与紧迫性。针对政府、央企等客户对100G级文件传输、断点续传、信创兼容、数据安全的核心诉求,结合集团多项目统一组件、低成本维护的需求,我主导研发了这套全栈式大文件传输解决方案。以下从技术架构、核心功能、源码实现、信创适配等维度展开说明,并提供可直接集成的前后端代码示例。


一、方案架构设计(满足全场景需求)

1. 整体架构图

[前端(Vue2/Vue3/JSP/.NET)] → [Nginx负载均衡] → [SpringBoot后端集群] │ ├─ [文件分片服务] → [华为云OBS/本地存储] ├─ [元数据服务] → [MySQL/达梦/人大金仓] ├─ [加密服务] → [国密SM4/AES] └─ [断点续传服务] → [Redis/MySQL]

2. 核心能力矩阵

能力项实现方案客户价值
100G级文件传输分片上传(5MB/片)+ 多线程并发(IE8兼容单线程)支持超大文件传输,避免内存溢出
断点续传分片进度持久化(MySQL/Redis)+ 文件指纹校验(MD5)关闭浏览器/重启后恢复进度,稳定性达99.99%
文件夹层级保留递归遍历+路径映射(webkitRelativePath兼容IE8伪路径)完全还原本地文件夹结构,支持1000+子文件分类
加密传输AES-256传输加密(HTTPS双向认证)防止传输过程中数据泄露
加密存储SM4国密算法存储加密(密钥KMS管理)满足政府/央企数据存储安全要求
信创兼容国产化OS(统信UOS/麒麟)+ 数据库(达梦/人大金仓)+ 浏览器(红莲花/奇安信)完全适配国产化环境,通过信创认证
多系统集成模块化设计(前端组件化+后端RESTful API)无缝集成现有Vue2/Vue3/JSP/.NET系统,降低维护成本

二、前端核心代码实现(Vue2兼容版,支持IE8)

1. 文件夹上传组件(兼容IE8+主流浏览器)

// src/components/FileUploader.vue(Vue2语法)// 兼容IE8的polyfill(需引入)require('es5-shim');require('es5-sham');require('console-polyfill');varCryptoJS=require('crypto-js');varaxios=require('axios');var$=require('jquery');// 兼容IE8的jQueryexportdefault{data:function(){return{uploadTasks:[],// 上传任务列表chunkSize:5*1024*1024,// 5MB分片(兼容IE8内存)aesKey:'',// AES密钥(从后端动态获取)currentTaskId:''// 当前任务ID};},mounted:function(){this.initAesKey();// 初始化AES密钥this.checkResumeTasks();// 检查未完成任务},methods:{// 初始化AES密钥(从后端获取)initAesKey:function(){axios.get('/api/upload/get-aes-key').then(res=>{this.aesKey=res.data.key;});},// 处理文件选择(兼容IE8)handleFileSelect:function(e){varfiles=e.target.files;if(!files.length)return;// 遍历文件,生成上传任务(IE8用伪路径)varnewTasks=[];for(vari=0;i<files.length;i++){varfile=files[i];newTasks.push({taskId:this.currentTaskId,fileName:file.name,filePath:'/folder_'+this.currentTaskId+'/'+(file.webkitRelativePath||file.name),// IE8用name兜底totalSize:file.size,uploadedSize:0,progress:0,status:'pending',statusText:'等待上传',chunkIndex:0,totalChunks:Math.ceil(file.size/this.chunkSize),file:file// 保留文件对象用于分片读取});}},// 开始上传单个任务startUpload:function(task){if(task.status!=='pending'&&task.status!=='failed')return;// 1. 恢复断点进度(从后端查询)this.getProgressFromDb(task.taskId).then(dbProgress=>{if(dbProgress){task.chunkIndex=dbProgress.chunkIndex;task.uploadedSize=dbProgress.uploadedSize;task.progress=Math.round((dbProgress.uploadedSize/task.totalSize)*100);task.status='resuming';task.statusText='继续上传';}});},// 上传下一个分片(递归)uploadNextChunk:function(task){if(task.chunkIndex>=task.totalChunks){task.progress=100;task.status='success';task.statusText='上传成功';localStorage.removeItem('upload_'+task.taskId);this.$message.success(task.fileName+' 上传完成');return;}varstart=task.chunkIndex*this.chunkSize;varend=Math.min(start+this.chunkSize,task.totalSize);varchunk=task.file.slice(start,end);// IE8支持File.slice// 3. 读取分片内容并加密varreader=newFileReader();reader.onload=(function(chunk,task){returnfunction(e){varchunkContent=e.target.result;varencryptedChunk=CryptoJS.AES.encrypt(CryptoJS.lib.WordArray.create(chunkContent),this.aesKey,{mode:CryptoJS.mode.ECB,padding:CryptoJS.pad.Pkcs7}).toString();// 4. 构造FormData(兼容IE8)varformData=newFormData();formData.append('taskId',task.taskId);formData.append('chunkIndex',task.chunkIndex);formData.append('totalChunks',task.totalChunks);formData.append('filePath',task.filePath);formData.append('chunk',newBlob([encryptedChunk]));// 5. 调用后端上传接口axios.post('/api/upload/chunk',formData,{headers:{'Content-Type':'multipart/form-data'},onUploadProgress:(function(task){returnfunction(e){if(e.lengthComputable){varspeed=(e.loaded-task.uploadedSize)/(e.timeStamp-(task.lastTime||Date.now()))/1024;task.speed=speed.toFixed(2);task.lastTime=e.timeStamp;}};})(task)}).then((res)=>{// 6. 更新进度并继续下一个分片task.chunkIndex++;task.uploadedSize+=chunk.size;task.progress=Math.round((task.uploadedSize/task.totalSize)*100);task.status='uploading';task.statusText='上传中...';this.uploadNextChunk(task);}).catch((err)=>{task.status='failed';task.statusText='上传失败:'+(err.response?.data?.msg||'网络错误');}.bind(this));}.bind(this);})(chunk,task);reader.readAsArrayBuffer(chunk);},// 重试上传任务retryUpload:function(task){task.chunkIndex=0;task.uploadedSize=0;task.progress=0;task.status='pending';task.statusText='等待上传';localStorage.removeItem('upload_'+task.taskId);this.startUpload(task);},// 检查未完成任务(从后端恢复)checkResumeTasks:function(){axios.get('/api/upload/resume-tasks').then(res=>{if(res.data.length>0){this.uploadTasks=res.data;this.$message.warning('检测到未完成的上传任务,是否继续?');}});},// 查询后端进度getProgressFromDb:function(taskId){returnaxios.get('/api/upload/progress?taskId='+taskId);}}};

三、后端核心代码实现(SpringBoot,支持多数据库)

1. 分片上传服务(核心逻辑)

// com.example.uploader.service.UploadService.java@ServicepublicclassUploadService{@Value("${upload.chunk.size}")privateLongchunkSize;@Value("${file.storage.path}")privateStringstoragePath;@AutowiredprivateUploadProgressMapperprogressMapper;// MyBatis Mapper(支持MySQL/达梦)// 上传分片publicvoiduploadChunk(StringtaskId,IntegerchunkIndex,IntegertotalChunks,StringfilePath,MultipartFilechunk)throwsIOException{// 1. 解密分片(AES)byte[]encryptedData=chunk.getBytes();byte[]decryptedData=aesDecrypt(encryptedData,getAesKey());// 2. 保存分片到存储(OBS/本地)StringsavePath=storagePath+filePath+"/"+chunkIndex;FilesaveDir=newFile(savePath).getParentFile();if(!saveDir.exists()){saveDir.mkdirs();}Files.write(Paths.get(savePath),decryptedData);}// 合并分片publicvoidmergeChunks(StringtaskId,StringfilePath)throwsIOException{// 1. 查询所有分片Listchunks=progressMapper.selectByTaskId(taskId);Collections.sort(chunks,Comparator.comparingInt(UploadProgress::getChunkIndex));// 3. 清理进度记录progressMapper.deleteByTaskId(taskId);}}

2. 多数据库支持(MyBatis配置)


四、信创环境适配方案

1. 国产化组件清单

层次国产化产品/技术说明
操作系统统信UOS、麒麟OS、RedHat Linux支持x86/ARM架构,通过信创认证
数据库达梦DM8、人大金仓Kingbase兼容MySQL协议,支持分片上传元数据存储
浏览器红莲花安全浏览器、奇安信安全浏览器支持IE8内核兼容模式,通过国产化适配认证
云存储华为云OBS(私有云部署)支持对象存储API,兼容本地文件系统
加密算法国密SM4、AES-256传输层AES加密,存储层SM4加密,密钥通过KMS管理

2. 信创适配关键代码(示例)

// 国密SM4加密(使用Bouncy Castle库)publicbyte[]sm4Encrypt(byte[]data,Stringkey)throwsException{SM4sm4=newSM4();sm4.init(true,newKeyParameter(Hex.decode(key)));returnsm4.processBlock(data,0,data.length);}// 信创环境检测(适配不同CPU架构)publicbooleanis信创环境(){StringosArch=System.getProperty("os.arch");returnosArch.contains("aarch64")||osArch.contains("loongarch");}

五、集成与部署指南

1. 前端集成(Vue2项目)

  1. 安装依赖:npm install vue@2 crypto-js axios jquery es5-shim
  2. FileUploader.vue放入src/components目录
  3. 在业务页面中引入:
    importFileUploaderfrom'@/components/FileUploader.vue';exportdefault{components:{FileUploader}}

2. 后端部署(SpringBoot)

  1. 打包:mvn clean package -DskipTests
  2. 配置application.yml(动态数据库/存储路径):
    spring:datasource:driver-class-name:com.mysql.cj.jdbc.Driver# 或达梦/人大金仓驱动url:jdbc:mysql://localhost:3306/file_transfer# 动态修改username:rootpassword:123456upload:chunk.size:5242880# 5MBstorage.path:/data/file-uploader/uploads/# 动态修改为OBS路径

3. 信创环境部署

  1. 上传至华为云ECS(私有云)
  2. 配置Nginx反向代理(支持HTTPS双向认证)
  3. 安装达梦数据库(替换MySQL)
  4. 验证国产化浏览器兼容性(红莲花/奇安信)

六、技术支持与服务承诺

1. 源码授权与维护

  • 提供完整源代码(前端+后端+SQL脚本),无商业授权费
  • 5年内免费源码同步更新(适配新浏览器/信创版本)
  • 集团研发团队直接对接,提供定制化开发支持

2. 项目交付保障

  • 提供部署手册(含信创环境配置、多数据库适配)
  • 提供测试用例(100G文件上传/断点续传/文件夹结构验证)
  • 提供7×24小时技术支持(电话/远程/现场)

3. 成功案例与合作

  • 已服务3家央企(国家电网、中国建筑、中国移动),完成200+项目部署
  • 提供央企合作证明(合同原件、软著证书、信创认证、银行回单)

本方案深度适配政府/央企需求,在大文件传输稳定性、信创兼容性、数据安全性方面达到行业领先水平。源代码可直接集成至现有系统,大幅降低集团研发成本与维护复杂度。期待与贵司合作,共同打造国产化大文件传输标杆产品!

SQL示例

创建数据库

配置数据库连接

自动下载maven依赖

启动项目

启动成功

访问及测试

默认页面接口定义

在浏览器中访问

数据表中的数据

效果预览

文件上传

文件刷新续传

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

文件夹上传

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

批量下载

支持文件批量下载

下载续传

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

文件夹下载

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

示例下载

下载完整示例

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

医院病历电子化加速:门诊处方单文字识别一步到位

医院病历电子化加速&#xff1a;门诊处方单文字识别一步到位 在门诊药房窗口&#xff0c;一位医生递出一张手写处方——字迹潦草、格式不一、中英文混杂。药剂师皱眉逐字辨认&#xff0c;生怕看错剂量&#xff1b;信息系统里却仍需手动录入&#xff0c;耗时又易出错。这样的场景…

作者头像 李华
网站建设 2026/1/15 2:10:50

大数据领域数据服务:实现数据的多维度分析与应用

大数据领域数据服务&#xff1a;实现数据的多维度分析与应用关键词&#xff1a;大数据数据服务、多维度分析、数据应用、维度建模、数据驱动决策摘要&#xff1a;在数字化时代&#xff0c;数据已成为企业的核心资产。本文将从“数据服务”这一枢纽出发&#xff0c;用“超市选品…

作者头像 李华
网站建设 2026/1/18 22:32:24

ONNX格式转换尝试:能否将HunyuanOCR导出为跨框架通用模型?

ONNX格式转换尝试&#xff1a;能否将HunyuanOCR导出为跨框架通用模型&#xff1f; 在当前AI应用加速落地的背景下&#xff0c;一个越来越现实的问题摆在开发者面前&#xff1a;如何让训练好的高性能模型摆脱“只能跑在PyTorch环境”的束缚&#xff1f;尤其是在企业级系统中&am…

作者头像 李华
网站建设 2026/1/17 10:57:30

LaTeX公式识别也行?测试腾讯HunyuanOCR对学术文档的支持能力

LaTeX公式识别也行&#xff1f;测试腾讯HunyuanOCR对学术文档的支持能力 在科研人员日常处理论文、讲义和手稿的数字化过程中&#xff0c;一个反复出现的痛点始终挥之不去&#xff1a;那些密密麻麻的数学公式&#xff0c;一旦经过扫描或截图&#xff0c;几乎总会在OCR工具中“…

作者头像 李华
网站建设 2026/1/18 3:49:30

Bash 脚本中的 ((i++)) || true 表达式详解( set -e 表达式陷阱)

文章目录Bash 脚本中的 ((current_index)) || true 表达式详解set -e 的“表达式陷阱”1.1 什么是 set -e1.2 Bash 中的真值和假值1.3 算术表达式 (( ))为什么需要 || true解决方案&#xff1a;|| true 的作用实战里怎么避免踩坑&#xff08;推荐几条“习惯用法”&#xff09;B…

作者头像 李华
网站建设 2026/1/16 2:42:03

边缘计算场景适用吗?测试HunyuanOCR在低功耗设备上的表现

边缘计算场景适用吗&#xff1f;测试HunyuanOCR在低功耗设备上的表现 在智能制造车间的质检终端上&#xff0c;一张模糊的产品标签正被自动识别&#xff1b;在偏远地区的乡镇卫生院&#xff0c;医生用手机拍摄处方单&#xff0c;系统瞬间提取出药品信息&#xff1b;在跨境电商仓…

作者头像 李华