news 2026/4/23 20:07:24

军工系统中,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/4/23 12:31:47

NBTExplorer全平台解决方案技术指南:从安装到精通

NBTExplorer全平台解决方案技术指南&#xff1a;从安装到精通 【免费下载链接】NBTExplorer A graphical NBT editor for all Minecraft NBT data sources 项目地址: https://gitcode.com/gh_mirrors/nb/NBTExplorer 1. 问题诊断&#xff1a;跨平台部署的技术瓶颈分析 …

作者头像 李华
网站建设 2026/4/23 14:40:31

阿里云持续交付平台,让软件发布更快更稳

对于希望实现快速、可靠软件发布的团队来说&#xff0c;选择一个高效的持续交付平台至关重要。阿里云持续交付平台提供了一站式的解决方案&#xff0c;将代码管理、构建、测试、部署和监控等环节无缝衔接&#xff0c;其核心在于通过自动化流水线&#xff0c;减少人工干预&#…

作者头像 李华
网站建设 2026/4/23 14:49:55

突破型MOD开发工具:RPFM如何让Total War模组效率提升300%

突破型MOD开发工具&#xff1a;RPFM如何让Total War模组效率提升300% 【免费下载链接】rpfm Rusted PackFile Manager (RPFM) is a... reimplementation in Rust and Qt5 of PackFile Manager (PFM), one of the best modding tools for Total War Games. 项目地址: https://…

作者头像 李华
网站建设 2026/4/18 9:58:47

全网最全9个降AI率网站,千笔·降AIGC助手帮你解决降AIGC难题

AI降重工具&#xff1a;从技术到实用的全面革新 在当前学术写作中&#xff0c;AI生成内容&#xff08;AIGC&#xff09;已成为普遍现象&#xff0c;但随之而来的高AIGC率和查重问题也给学生和研究者带来了不小的困扰。如何在保持原文语义和逻辑的前提下&#xff0c;有效降低AI痕…

作者头像 李华
网站建设 2026/4/23 14:41:30

200条高可用、工业级Shell脚本与命令系统

文章目录 200条高可用、工业级Shell脚本与命令系统 一、核心架构与设计原则 1.1 系统架构 1.2 设计原则 二、工业级核心模块(100+条命令) 2.1 系统监控与诊断(工业级增强版) 2.2 网络诊断与管理(工业级增强版) 2.3 存储与文件系统(工业级增强版) 2.4 安全与审计(工业级…

作者头像 李华
网站建设 2026/4/23 14:48:08

工业级脚本封装核心思路

文章目录 一、工业级脚本封装核心思路 二、完整工业级脚本实现 三、脚本核心模块说明 1. 基础保障模块 2. 信息采集模块 3. 输出与交互模块 四、脚本使用方法 1. 前置准备 2. 核心使用示例 3. 批量扩展(集群场景) 五、工业级扩展建议 总结 你想把提取CPU、内存、硬盘、网络硬…

作者头像 李华