大文件传输系统技术方案

一、技术选型与架构设计

作为项目负责人,我主导设计了基于现有技术栈的混合架构方案:

  1. 前端架构:采用Vue2 CLI框架兼容模式,通过Webpack配置同时支持Vue2/Vue3组件,通过条件编译实现React项目集成
  2. 传输核心:自研基于WebSocket+Chunked的传输协议,兼容HTTP/1.1分块传输编码
  3. 加密体系:构建动态加密引擎,支持SM4/AES双算法热切换,密钥管理采用国密SM2非对称加密
  4. 存储架构:阿里云OSS直传+本地缓存双模式,支持断点续传元数据持久化到MySQL/Redis
二、核心功能实现代码

前端实现(Vue2示例)

// file-uploader.vue
export default {
  data() {
    return {
      chunkSize: 5 * 1024 * 1024, // 5MB分片
      cryptoType: 'SM4', // 默认国密
      uploadQueue: []
    }
  },
  methods: {
    async handleFolderUpload(event) {
      const files = await this.traverseFolder(event.target.files[0])
      files.forEach(file => {
        const fileId = this.generateFileId()
        this.initUploadTask(file, fileId)
      })
    },
    
    initUploadTask(file, fileId) {
      const task = {
        file,
        fileId,
        uploadedSize: this.getResumeOffset(fileId),
        chunks: Math.ceil(file.size / this.chunkSize)
      }
      
      // IE8兼容处理
      if (window.ActiveXObject || "ActiveXObject" in window) {
        this.uploadViaFormData(task)
      } else {
        this.uploadViaWebSocket(task)
      }
    },
    
    async uploadViaWebSocket(task) {
      const socket = new WebSocket(`wss://${location.host}/ws/upload`)
      socket.binaryType = 'arraybuffer'
      
      socket.onopen = () => {
        for (let i = task.uploadedSize / this.chunkSize; i < task.chunks; i++) {
          const chunk = this.readFileChunk(task.file, i)
          const encrypted = this.encryptChunk(chunk)
          socket.send(this.buildChunkPacket(task.fileId, i, encrypted))
        }
      }
    }
  }
}

后端实现(Spring Boot兼容层)

// FileUploadController.java
@RestController
@RequestMapping("/api/upload")
public class FileUploadController {
    
    @Autowired
    private ChunkStorageService chunkStorage;
    
    @Autowired
    private CryptoService cryptoService;
    
    @PostMapping("/init")
    public ResponseEntity initUpload(
            @RequestBody UploadInitRequest request) {
        
        // 生成唯一任务ID
        String taskId = UUID.randomUUID().toString();
        
        // 创建加密上下文
        CryptoContext ctx = cryptoService.createContext(
            request.getCryptoType(), 
            request.getPassword()
        );
        
        // 持久化到MySQL
        uploadTaskRepository.save(new UploadTask(
            taskId, 
            request.getFileName(), 
            request.getFileSize(),
            ctx.getEncryptKey()
        ));
        
        return ResponseEntity.ok(new UploadInitResponse(taskId));
    }
    
    @PostMapping("/chunk")
    public ResponseEntity uploadChunk(
            @RequestParam String taskId,
            @RequestParam int chunkIndex,
            @RequestBody byte[] chunkData) {
        
        // 解密分片
        UploadTask task = uploadTaskRepository.findById(taskId)
            .orElseThrow(() -> new RuntimeException("Task not found"));
        
        byte[] decrypted = cryptoService.decrypt(
            chunkData, 
            task.getEncryptKey(),
            task.getCryptoType()
        );
        
        // 存储到OSS
        chunkStorage.storeChunk(taskId, chunkIndex, decrypted);
        
        // 更新进度到Redis
        redisTemplate.opsForValue().set(
            "upload:progress:" + taskId, 
            String.valueOf(chunkIndex)
        );
        
        return ResponseEntity.ok().build();
    }
}
三、关键技术突破点
  1. 跨浏览器兼容方案:

    • 针对IE8开发ActiveX插件作为降级方案
    • 采用Flash作为文件选择器替代方案
    • 通过条件注释实现CSS/JS的浏览器特异性加载
  2. 超大文件夹处理:

// 文件夹遍历算法(支持10万级文件)
async traverseFolder(folderEntry) {
  const fileTree = { name: folderEntry.name, children: [] }
  const reader = folderEntry.createReader()
  
  return new Promise((resolve) => {
    const readEntries = () => {
      reader.readEntries(async (entries) => {
        if (!entries.length) {
          resolve(fileTree)
          return
        }
        
        for (let entry of entries) {
          if (entry.isFile) {
            const file = await new Promise(res => entry.file(res))
            fileTree.children.push(file)
          } else {
            const subTree = await this.traverseFolder(entry)
            fileTree.children.push(subTree)
          }
        }
        
        readEntries() // 递归读取
      })
    }
    
    readEntries()
  })
}
  1. 内存优化技术:
    • 采用流式处理替代全量加载
    • 实现分片缓存机制(LRU算法)
    • 服务器端使用NIO模型处理并发
四、信创环境适配方案
  1. 数据库兼容层:
// DynamicDataSourceConfig.java
@Configuration
public class DynamicDataSourceConfig {
    
    @Bean
    @Primary
    public DataSource dynamicDataSource(
            @Qualifier("mysqlDataSource") DataSource mysql,
            @Qualifier("oracleDataSource") DataSource oracle,
            @Qualifier("sqlServerDataSource") DataSource sqlServer) {
        
        Map targetDataSources = new HashMap<>();
        targetDataSources.put("mysql", mysql);
        targetDataSources.put("oracle", oracle);
        targetDataSources.put("sqlserver", sqlServer);
        
        DynamicDataSource dynamicDataSource = new DynamicDataSource();
        dynamicDataSource.setTargetDataSources(targetDataSources);
        dynamicDataSource.setDefaultTargetDataSource(mysql);
        
        return dynamicDataSource;
    }
}
  1. 加密算法热切换:
// CryptoContextFactory.java
public class CryptoContextFactory {
    
    public static CryptoContext create(String algorithm, String key) {
        switch (algorithm.toUpperCase()) {
            case "SM4":
                return new SM4Context(key);
            case "AES":
                return new AESContext(key);
            default:
                throw new IllegalArgumentException("Unsupported algorithm");
        }
    }
}

// 使用示例
CryptoContext ctx = CryptoContextFactory.create(
    config.getCryptoType(), 
    config.getCryptoKey()
);
五、商务合作方案

针对公司年项目量200+的实际情况,建议采用:

  1. 买断授权模式:

    • 一次性买断费用:98万元(含5年技术支持)
    • 授权范围:公司所有项目无限使用
    • 交付物:
      • 完整源代码(含加密模块)
      • 信创环境认证证书
      • 3个央企案例合作证明
  2. 技术保障体系:

    • 驻场开发支持(首年2人月)
    • 7×24小时紧急响应
    • 季度性安全审计
  3. 定制开发服务:

    • 现有JSP系统无缝集成
    • 特殊浏览器兼容开发
    • 私有云部署优化
六、实施路线图
  1. 第一阶段(1个月):

    • 完成核心传输引擎开发
    • 实现SM4加密模块
    • 搭建测试环境(含IE8兼容测试)
  2. 第二阶段(2个月):

    • 开发文件夹遍历组件
    • 实现分片缓存机制
    • 完成MySQL/Oracle适配
  3. 第三阶段(1个月):

    • 压力测试(10万文件级)
    • 信创环境认证
    • 客户现场部署培训

该方案已通过技术委员会评审,预计可降低授权成本85%以上,同时将大文件传输稳定性提升至99.99%。下一步将启动供应商技术对接和POC测试。

导入项目

导入到Eclipse:点南查看教程
导入到IDEA:点击查看教程
springboot统一配置:点击查看教程

工程

image

NOSQL

NOSQL示例不需要任何配置,可以直接访问测试
image

创建数据表

选择对应的数据表脚本,这里以SQL为例
image
image

修改数据库连接信息

image

访问页面进行测试

image

文件存储路径

up6/upload/年/月/日/guid/filename
image
image

效果预览

文件上传

文件上传

文件刷新续传

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

文件夹上传

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

批量下载

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

下载续传

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

文件夹下载

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

下载示例

点击下载完整示例

Logo

火山引擎视频云技术社区,是面向 AI 音视频开发者的技术交流平台。这里汇聚源自抖音、豆包等亿级 DAU 产品的 RTC、直播、点播、AI 媒体处理、音视频互动技术,提供接入指南、最佳实践、性能调优、场景案例、Demo 代码、开源项目、白皮书和 API 文档。社区汇聚官方工程师与一线开发者,为 AI 视频通话、数字人、AI 视频处理等应用的开发与落地提供技术支持。

更多推荐