news 2026/8/29 3:33:14

军工系统中,SpringCloud如何处理百M级别大文件的下载速度?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
军工系统中,SpringCloud如何处理百M级别大文件的下载速度?

政府涉密项目大文件传输系统技术方案

——基于信创环境的SM4国密加密与JSP业务集成

一、项目背景与核心需求

作为北京某上市公司项目经理,我司承担的某部委涉密项目需实现10GB级安全文件传输,并深度集成至现有JSP业务系统。核心需求包括:

  1. 涉密文件传输:10GB文件及文件夹(保留层级结构)上传/下载
  2. 国密安全要求:全程采用SM4算法加密,支持人大金仓国产数据库
  3. 全浏览器兼容:IE8+及国产浏览器(奇安信/红莲花/龙芯)
  4. 信创生态适配
    • 操作系统:中标麒麟/统信UOS
    • 数据库:人大金仓V8(兼容Oracle语法)
    • 中间件:Tomcat 9.0(JSP支持)
  5. 源码可控:提供完整源代码,支持二次开发(如与CA证书集成)

二、技术选型与架构设计
1. 分层架构设计

用户终端

Web前端

JSP服务端

国密加密服务

人大金仓数据库

SM4硬件加密卡

业务系统集成

2. 关键组件选型
组件类型选型方案国产化适配说明
前端框架Vue 2.6 + jQuery 1.12(IE8兼容)通过es5-shim支持IE8语法
分片上传自定义实现(基于FileReader兼容IE10+的Blob回退方案
国密算法Bouncy Castle(Java端)通过JCE提供SM4加密API
服务端Spring Boot 2.7 + JSP保持现有技术栈,提供RESTful接口
数据库MyBatis + 人大金仓V8使用kingbase8JDBC驱动
存储本地磁盘 + 元数据数据库避免依赖FastDFS等分布式系统

三、核心代码实现
1. 前端分片上传(兼容IE8)
// IE8兼容的SM4加密工具(基于CryptoJS)varSM4Crypto={encrypt:function(data,key){// 实际项目中替换为GMSSL的WebAssembly版本returnCryptoJS.SM4.encrypt(data,key).toString();},decrypt:function(ciphertext,key){returnCryptoJS.SM4.decrypt(ciphertext,key).toString(CryptoJS.enc.Utf8);}};// 文件夹上传处理器(递归遍历文件树)functionFolderUploader(options){this.chunkSize=5*1024*1024;// 5MB分片this.fileId=this._generateUUID();}FolderUploader.prototype={_uploadFile:function(file,relativePath){varself=this;varchunks=Math.ceil(file.size/this.chunkSize);varkey="1234567890abcdef";// 实际从服务端获取for(vari=0;i<chunks;i++){varstart=i*this.chunkSize;varend=Math.min(file.size,start+this.chunkSize);varchunk=file.slice(start,end);varreader=newFileReader();reader.onload=function(e){varencrypted=SM4Crypto.encrypt(arrayBufferToBase64(e.target.result),key);varformData=newFormData();formData.append("file",newBlob([encrypted]));formData.append("chunkIndex",i);formData.append("totalChunks",chunks);formData.append("fileId",self.fileId);formData.append("relativePath",relativePath);formData.append("fileName",file.name);$.ajax({url:"/api/upload/chunk",type:"POST",data:formData,processData:false,contentType:false,success:function(){if(i===chunks-1)self._notifyComplete(file.name);}});};reader.readAsArrayBuffer(chunk);}},uploadFolder:function(folderEntry){varself=this;varreader=folderEntry.createReader();reader.readEntries(function(entries){for(vari=0;i<entries.length;i++){varentry=entries[i];if(entry.isFile){entry.file(function(file){self._uploadFile(file,entry.fullPath);});}elseif(entry.isDirectory){self.uploadFolder(entry);// 递归处理子目录}}});}};
2. 服务端JSP集成(Spring Boot Controller)
@RestController@RequestMapping("/api/upload")publicclassFileUploadController{@AutowiredprivateKingbaseTemplatekingbaseTemplate;@Value("${sm4.key}")privateStringsm4Key;@PostMapping("/chunk")publicResponseEntityhandleChunk(@RequestParam("file")MultipartFilefile,@RequestParamintchunkIndex,@RequestParaminttotalChunks,@RequestParamStringfileId,@RequestParamStringrelativePath,@RequestParamStringfileName){try{// 1. 解密分片(使用Bouncy Castle)byte[]decrypted=SM4Util.decrypt(file.getBytes(),sm4Key.getBytes());// 2. 暂存分片到本地PathtempDir=Paths.get("/data/chunks",fileId);Files.createDirectories(tempDir);Files.write(tempDir.resolve("chunk_"+chunkIndex),decrypted);// 3. 如果是最后一片,合并文件if(chunkIndex==totalChunks-1){PathmergedFile=mergeChunks(tempDir,fileId);saveToDatabase(fileId,fileName,relativePath,mergedFile);returnResponseEntity.ok().body(Collections.singletonMap("status","completed"));}returnResponseEntity.ok().body(Collections.singletonMap("status","accepted"));}catch(Exceptione){returnResponseEntity.status(500).build();}}privatevoidsaveToDatabase(StringfileId,StringfileName,StringrelativePath,PathfilePath){Stringsql="INSERT INTO SECURE_FILES "+"(FILE_ID, FILE_NAME, RELATIVE_PATH, STORAGE_PATH, CREATE_TIME) "+"VALUES (?, ?, ?, ?, NOW())";kingbaseTemplate.update(sql,fileId,fileName,relativePath,filePath.toString());}}
3. 人大金仓数据库适配
INSERT INTO SECURE_FILES ( FILE_ID, FILE_NAME, RELATIVE_PATH, STORAGE_PATH, CREATE_TIME ) VALUES ( #{fileId,jdbcType=VARCHAR}, #{fileName,jdbcType=VARCHAR}, #{relativePath,jdbcType=VARCHAR}, #{storagePath,jdbcType=VARCHAR}, CURRENT_TIMESTAMP ) SELECT * FROM SECURE_FILES WHERE RELATIVE_PATH LIKE #{pathPrefix} || '%' ORDER BY RELATIVE_PATH

四、关键问题解决方案
  1. IE8兼容性

    • 使用jQuery.ajax替代fetch,通过iframe实现文件下载
    • 禁用FileReader,改用FlashActiveX控件(仅限内网)
  2. 10GB文件性能优化

    • 前端:分片大小动态调整(根据网络状况5MB~20MB)
    • 服务端:异步合并分片,避免阻塞主线程
  3. 文件夹层级保留

    • 前端:记录webkitRelativePath(Chrome)或自定义路径解析
    • 服务端:将路径信息存入人大金仓的RELATIVE_PATH字段
  4. 信创环境适配

    • 数据库:使用人大金仓的kingbase8驱动,配置连接池
    • 加密:通过JCE提供SM4算法,避免依赖OpenSSL

五、项目实施计划
  1. 第一阶段(2周)

    • 完成SM4加密的Java/JS实现
    • 搭建人大金仓测试环境
    • 实现基础分片上传(1GB验证)
  2. 第二阶段(3周)

    • 开发文件夹层级处理逻辑
    • 完成IE8兼容性测试
    • 集成至现有JSP业务系统
  3. 第三阶段(1周)

    • 压力测试(10GB文件传输稳定性)
    • 编写安全审计日志模块
    • 准备涉密项目验收文档

六、风险评估与应对
风险项应对方案
IE8插件限制与浏览器厂商联合调试,采用ActiveX控件(仅限内网)
人大金仓性能问题优化SQL语句,添加RELATIVE_PATH字段索引
10GB内存溢出采用磁盘临时存储替代内存缓存
涉密审计要求记录所有文件操作日志至独立审计库

该方案已在统信UOS+飞腾服务器上验证,实现5GB文件稳定传输(速度3MB/s),SM4加密对性能影响控制在15%以内。下一步将优化分片合并策略,目标提升至5MB/s

SQL示例

创建数据库

配置数据库连接

自动下载maven依赖

启动项目

启动成功

访问及测试

默认页面接口定义

在浏览器中访问

数据表中的数据

效果预览

文件上传

文件刷新续传

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

文件夹上传

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

批量下载

支持文件批量下载

下载续传

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

文件夹下载

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

示例下载

下载完整示例

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

三步掌握网易云音乐插件管理:BetterNCM安装器全面指南

三步掌握网易云音乐插件管理&#xff1a;BetterNCM安装器全面指南 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 网易云音乐插件管理工具BetterNCM安装器是一款专为网易云音乐用户打造…

作者头像 李华
网站建设 2026/8/24 13:09:11

军工单位如何通过百度UMEDITOR实现WORD文档中图片的权限分级管理?

企业网站后台管理系统富文本编辑器功能扩展项目记录 一、项目背景与需求分析 作为北京某集团企业项目负责人&#xff0c;近期负责的项目中遇到新需求&#xff1a;在企业网站后台管理系统文章发布模块增加 Word 粘贴和导入功能&#xff0c;支持微信公众号内容粘贴&#xff08;…

作者头像 李华
网站建设 2026/8/26 23:55:57

教育行业,SpringBoot如何实现百M大文件的批量上传?

大文件传输系统解决方案&#xff08;山东某上市集团项目&#xff09; 作为山东某上市集团公司的项目负责人&#xff0c;针对集团大文件传输系统建设需求&#xff0c;我制定了以下专业解决方案&#xff1a; 一、系统架构设计 1.1 技术架构 ┌───────────────…

作者头像 李华
网站建设 2026/8/29 2:55:07

<span class=“js_title_inner“>《简爱》简用她的一生,告诉我们,越是孤独,越是没有朋友,越是没有支持的时候,越要学会尊重自己</span>

晚上好。不知道你有没有过这种感觉&#xff0c;就是当所有人都告诉你应该怎么做的时候&#xff0c;你心里却有个声音在说&#xff0c;不对。最近又翻了翻《简爱》&#xff0c;感觉和年轻时读完全不一样了。以前觉得这是个爱情故事&#xff0c;现在看&#xff0c;这根本就是一个…

作者头像 李华
网站建设 2026/8/25 12:19:51

NSGA-II 算法在储能优化配置中的功能解析与应用流程

储能选址定容&#xff0c;33节点&#xff0c;matpower潮流计算&#xff0c;计算目标函数。 考虑储能SOC、储能额定容量、功率约束。 NSGA2多目标&#xff1a;储能投资费用和电压偏差最小。 熵权TOPSIS确定最优解。 1. 算法概述 非支配排序遗传算法II&#xff08;NSGA-II&…

作者头像 李华