1. 项目背景与需求分析
在航空航天领域,三维模型文件的传输和处理一直是个棘手的问题。这些文件通常体积庞大(动辄几十GB),对传输的稳定性和安全性要求极高。我们最近为某航空设计院开发了一套大文件传输系统,核心需求就是解决三维模型文件在信创环境下的安全传输问题。
这个项目有几个关键挑战:
- 超大文件传输(100GB级别)的稳定性
- 国产化环境适配(麒麟/统信UOS操作系统+达梦数据库)
- 军工级安全要求(国密SM4加密+TLS 1.2+)
- 老旧浏览器兼容(包括IE8这种"古董")
2. 技术架构设计
2.1 整体架构
我们采用前后端分离架构:
- 前端:Vue2 + 改造版WebUploader(支持IE8)
- 后端:SpringBoot 2.7 + 华为OBS存储
- 中间件:Redis记录上传状态
- 安全层:BouncyCastle实现SM4加密
2.2 分片上传设计
对于三维模型文件,我们采用分片上传机制:
- 前端将文件切分为10MB的块
- 每个块单独上传并加密
- 后端将加密后的块暂存到华为OBS
- 所有块上传完成后触发合并
// 分片上传接口示例 @PostMapping("/chunk") public ResponseEntity uploadChunk( @RequestParam("file") MultipartFile chunk, @RequestParam("fileId") String fileId, @RequestParam("chunkNumber") int chunkNumber) { // 加密处理 byte[] encrypted = SM4Util.encrypt(chunk.getBytes(), key); // 上传到OBS String objectKey = "temp/"+fileId+"/"+chunkNumber; obsClient.putObject(bucket, objectKey, new ByteArrayInputStream(encrypted)); // 记录进度 redisTemplate.opsForSet().add("uploaded_chunks:"+fileId, chunkNumber); return ResponseEntity.ok().build(); }3. 断点续传实现
3.1 进度记录方案
我们采用Redis+本地存储双保险:
- Redis:存储全局上传进度(服务端)
- localStorage:记录客户端上传状态(防止页面刷新丢失)
// 前端断点续传逻辑 uploader.on('uploadBeforeSend', (block, data) => { const progress = localStorage.getItem(`progress_${data.fileId}`); if (progress) { data.chunk = JSON.parse(progress).nextChunk; } });3.2 续传流程
- 客户端查询Redis获取已上传分片列表
- 跳过已上传分片
- 从未完成的分片继续上传
@GetMapping("/progress") public UploadProgress getProgress(@RequestParam String fileId) { Set<Object> uploaded = redisTemplate.opsForSet() .members("uploaded_chunks:"+fileId); return new UploadProgress( uploaded.stream().map(o -> (Integer)o).collect(Collectors.toSet()), getNextChunk(uploaded) ); }4. 安全加密方案
4.1 国密SM4实现
我们使用BouncyCastle提供SM4加密支持:
public class SM4Util { static { Security.addProvider(new BouncyCastleProvider()); } public static byte[] encrypt(byte[] data, String key) throws Exception { Cipher cipher = Cipher.getInstance("SM4/ECB/PKCS5Padding", "BC"); SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "SM4"); cipher.init(Cipher.ENCRYPT_MODE, keySpec); return cipher.doFinal(data); } }4.2 传输层安全
- HTTPS强制使用TLS 1.2+
- 证书采用国密算法
- 每个分片单独加密
5. 信创环境适配
5.1 国产操作系统支持
通过Docker容器化解决环境差异:
FROM swr.cn-south-1.myhuaweicloud.com/kunpeng/ubuntu:20.04 RUN apt-get update && apt-get install -y openjdk-11-jdk fonts-wqy-zenhei COPY target/file-transfer.jar /app.jar ENTRYPOINT ["java", "-jar", "/app.jar"]5.2 多数据库支持
使用MyBatis-Plus动态数据源:
spring: datasource: dynamic: primary: dm datasource: dm: url: jdbc:dm://dm-server:5236/TEST driver-class-name: dm.jdbc.driver.DmDriver oracle: url: jdbc:oracle:thin:@//oracle-server:1521/ORCL driver-class-name: oracle.jdbc.OracleDriver6. 性能优化技巧
6.1 上传加速方案
- 采用多线程并发上传(默认3线程)
- 华为OBS SDK启用断点续传
- 服务端异步合并分片
6.2 内存优化
- 使用Streaming方式处理文件,避免内存溢出
- 限制单个分片大小(10MB)
- 启用OBS客户端缓存
7. 踩坑实录
7.1 IE8兼容问题
解决方案:
- 引入Flash上传组件(WebUploader的swf文件)
- 添加ES5 polyfill
- 禁用现代浏览器特性检测
7.2 国产浏览器问题
- 龙芯浏览器需要特殊字体配置
- 红莲花浏览器需关闭安全检测
7.3 OBS合并限制
华为OBS的ComposeObject接口有特殊限制:
- 单次最多合并32个分片
- 总大小不超过5GB
- 需要分阶段合并
8. 三维模型特殊处理
针对航空航天领域的三维模型文件(如CATIA、SolidWorks格式),我们增加了:
- 文件头校验:防止上传损坏文件
- 元数据提取:自动解析模型基本信息
- 预览图生成:服务端渲染缩略图
// 三维模型校验示例 public boolean validateModel(File file) { try(InputStream is = new FileInputStream(file)) { byte[] header = new byte[4]; is.read(header); return Arrays.equals(header, "3DML".getBytes()); } catch (IOException e) { return false; } }9. 部署方案
9.1 生产环境配置
- 华为ECS集群(8核16G起步)
- OBS私有桶+KMS加密
- Redis哨兵模式
- Nginx负载均衡
9.2 监控方案
- Prometheus监控上传进度
- Grafana展示实时指标
- 企业微信告警通知
10. 项目成果
最终系统实现了:
- 100GB文件稳定传输(实测峰值58MB/s)
- 全信创环境兼容
- 军工级安全标准
- 支持2000+并发上传
这套方案目前已在多个航空航天单位部署,特别适合需要传输大型三维模型的设计院所。在实际使用中,我们建议:
- 根据网络状况动态调整分片大小
- 定期清理OBS临时文件
- 对重要文件启用双加密(SM4+AES)