SpringMVC中如何实现视频文件的分块上传?

北京某上市集团企业级文件传输系统技术方案
项目负责人:XXX
技术架构组:研发中心-基础平台事业部


一、需求分析与技术痛点

1. 核心需求矩阵
需求维度技术挑战政企特殊要求
50G+文件传输内存溢出风险等保三级合规
信创全适配龙芯MIPS指令集兼容国产密码算法认证
IE8+Win7支持ActiveX签名证书军品代码审计
百亿级文件存储OBS海量文件性能数据出境管控
2. 现有方案缺陷
  • WebUploader:Flash依赖(不符合信创要求)
  • Resumable.js:无文件夹结构保持
  • Tus协议:IE8完全不支持
  • 商业控件:无法获得源码(违反集团采购规定)

二、技术架构设计

1. 整体架构图
服务端
客户端
华为OBS适配层
SpringBoot
国密解密集群
分布式任务队列
文件分片引擎
Vue2组件
国密加密模块
断点记录器
达梦/金仓
2. 关键技术选型
模块技术方案政企合规证明
文件分片自主研发分片算法(专利号ZL2023XXXXXX)商用密码产品型号证书
断点存储IndexedDB+IE UserData双写等保三级检测报告
国密传输SM4-GCM模式+SSL双加密国家密码管理局认证

三、核心代码实现

1. 前端文件夹结构保持(Vue2)
// folder-uploader.js
export default {
  methods: {
    async scanFolder(entry) {
      const items = [];
      const reader = entry.createReader();
      
      const readEntries = () => new Promise(resolve => {
        reader.readEntries(async (entries) => {
          if (!entries.length) return resolve();
          
          for (const entry of entries) {
            const item = {
              path: entry.fullPath.replace(/^\//, ''),
              isDir: entry.isDirectory
            };
            
            if (entry.isFile) {
              item.size = (await getFile(entry)).size;
              item.hash = await calculateHash(entry);
            } else {
              item.children = await this.scanFolder(entry);
            }
            
            items.push(item);
          }
          await readEntries();
          resolve();
        });
      });
      
      await readEntries();
      return items;
    }
  }
}
2. 后端分片处理(SpringBoot)
// FileChunkController.java
@PostMapping("/upload")
public ResponseEntity uploadChunk(
    @RequestParam("file") MultipartFile file,
    @RequestParam("chunkNumber") int chunkNumber,
    @RequestParam("totalChunks") int totalChunks,
    @RequestParam("identifier") String identifier) {
    
    // 国密解密
    SM4Engine sm4 = new SM4Engine(config.getSm4Key());
    byte[] decrypted = sm4.decrypt(file.getBytes());
    
    // 写入华为OBS
    String chunkKey = "chunks/" + identifier + "/" + chunkNumber;
    obsClient.putObject(bucketName, chunkKey, new ByteArrayInputStream(decrypted));
    
    // 记录到数据库
    jdbcTemplate.update(
        "INSERT INTO file_chunks (file_id, chunk_num, status) " +
        "VALUES (?, ?, 'UPLOADED') ON DUPLICATE KEY UPDATE status='UPLOADED'", 
        identifier, chunkNumber);
    
    return ResponseEntity.ok().build();
}
3. IE8兼容方案


四、信创环境适配方案

1. 国产浏览器检测逻辑
const browserMap = {
  'Loongson': () => import('./sm4-js'),      // 龙芯专用JS版
  'RedLotus': () => initActiveXBackup(),     // 红莲花备用通道
  'QAXBrowser': () => disableWASM()          // 奇安信特殊处理
};

export function initEncryption() {
  const ua = navigator.userAgent;
  for (const [key, handler] of Object.entries(browserMap)) {
    if (ua.includes(key)) {
      return handler();
    }
  }
  // 默认使用WASM加速版
  return import('./sm4-wasm'); 
}
2. 数据库动态配置
# application-dm.yml (达梦配置示例)
spring:
  datasource:
    driver-class-name: dm.jdbc.driver.DmDriver
    url: jdbc:dm://${DB_HOST}:${DB_PORT}/DAMENG
    username: ${DB_USER}
    password: ${DB_PWD}
    
  jpa:
    database-platform: org.hibernate.dialect.DmDialect
    hibernate:
      ddl-auto: none

五、商务实施建议

1. 采购方案对比
选项成本风险集团收益
自研开发200人天+技术攻关周期长完全自主可控
源码采购¥150万需厂商技术兜底可复用至2000+项目
商业授权¥80万/年绑定供应商无源码积累

推荐选择:源码采购(预算160万内)

2. 供应商资质要求
1. **必备证明文件**  
   - [ ] 央企合作案例合同(至少3个部委项目)  
   - [ ] 军密级产品认证证书  
   - [ ] 华为云鲲鹏兼容性认证  

2. **交付物清单**  
   - 全量源代码(含国密算法实现)  
   - 信创环境编译工具链  
   - 安全审计报告(中国网安出具)  
3. 实施里程碑
    title 项目实施计划
    dateFormat  YYYY-MM-DD
    section 第一阶段
    源码交付       :done,    des1, 2024-03-01, 15d
    环境适配       :active,  des2, 2024-03-16, 30d
    section 第二阶段
    等保测评       :         des3, 2024-04-15, 20d
    部委试点      :         des4, 2024-05-05, 45d

当前进展:已完成与华为云OBS的深度对接,实测传输100G文件夹(含5层嵌套结构)耗时38分钟,平均速率52.3MB/s。正在与中科方德洽谈源码采购事宜,其提供的SM4硬件加速卡可提升加密性能300%。

下一步计划

  1. 组织集团技术委员会评审会(附《国密传输白皮书》)
  2. 启动供应商背调(重点核查某军工单位合作真实性)
  3. 安排银河麒麟环境下压力测试

(注:随方案附上《信创环境测试报告》及《等保三级合规检查表》,供领导决策参考)

SQL示例

创建数据库

image

配置数据库连接

image

自动下载maven依赖

image

启动项目

image

启动成功

image

访问及测试

默认页面接口定义

image

在浏览器中访问

image

数据表中的数据

image

效果预览

文件上传

文件上传

文件刷新续传

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

文件夹上传

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

批量下载

支持文件批量下载
批量下载

下载续传

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

文件夹下载

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

示例下载

下载完整示例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值