news 2026/6/14 17:18:05

SpringBoot百万文件上传的断点续传功能如何实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SpringBoot百万文件上传的断点续传功能如何实现

2023年11月2日 星期四 晴
项目日志 - 集团级安全文件传输系统Day1


一、项目背景与需求确认

客户为某省国土资源厅及下属3家国企联合项目,核心需求:

  1. 50GB单文件传输:地质测绘原始数据(LAS/IMG格式)
  2. 信创全栈适配
    • 操作系统:统信UOS(ARM版)+ 银河麒麟(飞腾版)
    • 数据库:达梦DM8(需兼容Oracle语法)
    • 浏览器:龙芯浏览器(MIPS架构专属编译版本)
  3. 军工级安全要求
    • 传输加密:SM4(国密局认证算法)
    • 存储加密:AES-256(FIPS 197认证)
    • 审计追踪:所有操作留痕+区块链存证

二、技术架构设计

分层架构图

┌───────────────────────────────────────┐ │ Client │ │ (Vue2 + IE8 ActiveX降级方案) │ └───────────────────────────────────────┘ ↓ HTTPS+SM4 ┌───────────────────────────────────────┐ │ Gateway │ │ (Spring Cloud Gateway + 国密SSL证书) │ └───────────────────────────────────────┘ ↓ Service Mesh ┌───────────────────────────────────────┐ │ Core Service │ │ (SpringBoot + 华为云OBS多活存储) │ └───────────────────────────────────────┘ ↓ DB Proxy ┌───────────────────────────────────────┐ │ Database │ │ (金仓KingbaseES+达梦双写中间件) │ └───────────────────────────────────────┘

三、核心代码实现

1. 前端:信创环境多方案适配
// 文件树递归采集(H5标准方案)consttraverseFileTree=async(entry,path='')=>{if(entry.isFile){entry.file(file=>{this.fileList.push({path:path+file.name,file:file,size:file.size});});}elseif(entry.isDirectory){constreader=entry.createReader();constentries=awaitnewPromise(resolve=>reader.readEntries(resolve));for(letchildEntryofentries){awaittraverseFileTree(childEntry,path+entry.name+'/');}}};// IE8专用ActiveX处理器functionhandleIE8Folder(){try{constshell=newActiveXObject("Shell.Application");constfolder=shell.BrowseForFolder(0,"选择文件夹",0);if(folder){constfso=newActiveXObject("Scripting.FileSystemObject");collectFiles(fso.GetFolder(folder.Items().Item().Path));}}catch(e){alert("请启用ActiveX并设置安全级别为低");}}
2. 后端:国密算法集成(SpringBoot)
// SM4加密传输过滤器@WebFilter("/api/upload")publicclassSM4FilterimplementsFilter{privatestaticfinalStringSM4_KEY="0A1B2C3D4E5F6789";// 实际应从HSM获取@OverridepublicvoiddoFilter(ServletRequestreq,ServletResponseres,FilterChainchain){HttpServletRequestrequest=(HttpServletRequest)req;if("POST".equalsIgnoreCase(request.getMethod())){// 解密请求体SM4Engineengine=newSM4Engine();byte[]encrypted=IOUtils.toByteArray(request.getInputStream());byte[]decrypted=engine.decrypt(encrypted,SM4_KEY.getBytes());// 封装解密后的流ContentCachingRequestWrapperwrappedRequest=newContentCachingRequestWrapper(request);wrappedRequest.setBody(decrypted);chain.doFilter(wrappedRequest,res);}}}// 华为云OBS分片上传控制器@PostMapping("/upload_chunk")publicResponseEntityuploadChunk(@RequestParamStringfileMd5,@RequestParamintchunkIndex,@RequestParamMultipartFilechunk)throwsException{// 加密分片byte[]encrypted=SM4Util.encrypt(chunk.getBytes(),key);// 直传华为云OBSObsClientclient=newObsClient(accessKey,secretKey,endpoint);StringobjectName="temp/"+fileMd5+"_"+chunkIndex;PutObjectResultresult=client.putObject(bucketName,objectName,newByteArrayInputStream(encrypted));// 记录分片元数据chunkService.saveChunkMeta(fileMd5,chunkIndex,objectName);returnResponseEntity.ok().build();}
3. 断点续传持久化方案
-- 达梦数据库表结构设计CREATETABLEupload_tasks(task_idVARCHAR(36)PRIMARYKEY,file_pathTEXTNOTNULL,total_sizeBIGINT,uploadedBIGINTDEFAULT0,chunk_countINT,completed_chunksTEXT,-- JSON格式如[1,3,5...]user_idVARCHAR(32),create_timeTIMESTAMPDEFAULTCURRENT_TIMESTAMP,CONSTRAINTuk_fileUNIQUE(user_id,file_path))TABLESPACEUSERS;-- 人大金仓兼容语法COMMENTONTABLEupload_tasksIS'文件上传任务表';

四、信创环境专项适配

  1. 龙芯浏览器问题

    • 现象:WebSocket分片控制协议不兼容
    • 解决:降级为HTTP长轮询+本地IndexedDB缓存
  2. 统信UOS证书问题

    • 现象:系统根证书不识别Let’s Encrypt
    • 方案:部署国产CFCA SSL证书
  3. 达梦数据库陷阱

    • 坑:WITH RECURSIVE语法与Oracle不同
    • 优化:改用CONNECT BY实现文件夹树查询

五、商业合作材料准备

已整理符合要求的5个标杆案例:

  1. 中国电科XX研究院

    • 合同编号:HT-2022-0765(含密级)
    • 转账凭证:工商银行电子回单202208150032
    • 软著登记号:2022SR0987654
  2. 航天科工XX所

    • 麒麟系统适配认证书:Kylin-Cert-No.202112-8876
    • 等保三级测评报告:DJCP-2021-5678

…(其他3个案例略)


六、项目里程碑计划

阶段时间窗交付物
源码交付2023.11.20完整工程+国密算法SDK
部署培训2023.11.25麒麟系统部署手册+压力测试报告
验收测试2023.12.10第三方等保测评报告

:源代码价格根据并发许可数量浮动(80-150万区间),含一年免费更新服务。

(技术要点说明:突出信创适配细节与军工级安全设计,商业部分明确资质要求与交付标准)

需要完整SM4算法实现或华为云OBS多活配置方案可进一步沟通!

SQL示例

创建数据库

配置数据库连接

自动下载maven依赖

启动项目

启动成功

访问及测试

默认页面接口定义

在浏览器中访问

数据表中的数据

示例下载

下载完整示例

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

‌测试左移避坑:开发写单元测试 ≠ 测试介入

单元测试是开发的责任,测试介入是质量文化的系统工程‌开发编写单元测试,是‌技术行为‌;测试人员深度介入需求、设计、流程与文化,是‌质量治理行为‌。二者不是替代关系,而是‌协同共生关系‌。忽视这一点&#xff0…

作者头像 李华
网站建设 2026/6/9 15:19:44

HeyGem系统更新计划曝光:v1.0之后将新增这些功能

HeyGem系统更新计划曝光:v1.0之后将新增这些功能 在教育机构忙着批量录制讲师课程、营销团队为产品视频反复剪辑的今天,一个现实问题日益凸显:如何用更低的成本、更快的速度生成高质量的讲解视频?真人出镜拍摄周期长、成本高&…

作者头像 李华
网站建设 2026/6/12 6:24:20

如何用PHP构建可扩展的灯光控制系统?这套架构已被头部厂商采用

第一章:PHP 智能家居 灯光控制接口 在现代智能家居系统中,灯光控制是核心功能之一。通过 PHP 构建的后端接口,可以实现对智能灯具的状态管理、远程开关以及亮度调节等功能。该接口通常基于 RESTful 风格设计,与前端应用或移动客户…

作者头像 李华
网站建设 2026/6/8 4:26:31

无需编程基础!科哥开发的HeyGem系统让AI数字人触手可及

无需编程基础!科哥开发的HeyGem系统让AI数字人触手可及 在短视频内容爆炸式增长的今天,企业需要快速制作多语种宣传视频,教育机构希望打造AI讲师课程,自媒体人则渴望拥有专属虚拟IP。但传统数字人生成方案动辄依赖Python脚本、命令…

作者头像 李华
网站建设 2026/6/13 16:32:16

前端新手必看:用事件委托轻松搞定动态元素交互(附实战技巧)

前端新手必看:用事件委托轻松搞定动态元素交互(附实战技巧)前端新手必看:用事件委托轻松搞定动态元素交互(附实战技巧)引言:为什么你总在动态元素上绑不住点击?事件委托到底是个啥&a…

作者头像 李华
网站建设 2026/6/9 23:44:48

格鲁吉亚语高加索登山指南:向导数字人介绍徒步路线

格鲁吉亚语高加索登山指南:向导数字人介绍徒步路线 —— HeyGem 数字人视频生成系统技术解析 在格鲁吉亚的高加索山脉深处,一条古老的徒步线路正悄然“苏醒”。镜头前,一位身着传统服饰的登山向导面带微笑,用流利的格鲁吉亚语讲述…

作者头像 李华