news 2026/7/2 0:02:33

军工系统中,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/6/17 20:43:01

国防领域,SpringMVC如何支持百M大文件的稳定上传?

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

作者头像 李华
网站建设 2026/6/25 4:51:45

嵌入式拉篮品牌哪个好?五款热门产品深度解析与推荐

引言 在厨房装修与改造中&#xff0c;嵌入式拉篮已成为提升收纳效率与空间美感的关键组件。面对市场上众多品牌与型号&#xff0c;消费者常感困惑&#xff1a;嵌入式拉篮品牌哪个好&#xff1f;选择时需综合考虑品牌口碑、产品设计、材质工艺、收纳灵活性及性价比。 本文旨在…

作者头像 李华
网站建设 2026/6/30 20:38:56

用Matlab探索轨道车辆垂向振动:别样视角与Simpack的不同

与simpack不同&#xff0c;matlab建立轨道车辆&#xff08;垂向&#xff09;振动输入相应激励分析振动等 垂向 轨道车辆 在轨道车辆动力学研究领域&#xff0c;Simpack和Matlab都是常用工具&#xff0c;但它们有着不同的“性格”。今天咱就来聊聊Matlab在建立轨道车辆垂向振动…

作者头像 李华
网站建设 2026/6/23 23:04:57

如何用显卡性能优化工具实现游戏画质与帧率的双重提升?

如何用显卡性能优化工具实现游戏画质与帧率的双重提升&#xff1f; 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 当你在4K分辨率下激战游戏却遭遇帧率骤降&#xff0c;或升级显卡后仍未体验到应有画质时&#xff0c;…

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

6款搭载AI的论文工具因文本优化与多人协作,入选学术实用工具榜单

针对学术论文写作需求&#xff0c;目前市场上有多种AI工具可同时满足写作辅助与降重需求。这些智能平台通过自然语言处理技术提供论文框架生成、内容优化以及相似度检测功能&#xff0c;适用于毕业论文撰写、课程报告整理等场景。值得注意的是&#xff0c;此类工具应作为效率提…

作者头像 李华