大文件传输系统技术方案(北京教育行业国企项目)
一、系统架构设计
1.1 总体架构
1.2 技术选型
- 后端框架:SpringBoot 2.7.x + WebFlux(响应式支持)
- 前端框架:Vue2 CLI + IE8兼容方案(es5-shim + respond.js)
- 加密算法:SM4(国密) + AES(国际标准)双加密
- 断点续传:Redis + 数据库双重进度存储
- 文件夹结构:自定义元数据序列化协议
二、核心功能实现
2.1 分块上传(后端关键代码)
// FileChunkController.java@PostMapping("/upload/chunk")publicResponseEntityuploadChunk(@RequestParam("file")MultipartFilefile,@RequestParam("md5")Stringmd5,@RequestParam("chunkIndex")intchunkIndex,@RequestParam("totalChunks")inttotalChunks){// 1. 保存分片到临时目录PathtempPath=Paths.get("/temp/uploads",md5,chunkIndex+"");Files.write(tempPath,file.getBytes(),StandardOpenOption.CREATE);// 2. 更新Redis进度redisTemplate.opsForHash().put("upload_progress:"+md5,"chunk_"+chunkIndex,"completed");// 3. 检查是否全部上传完成if(isAllChunksUploaded(md5,totalChunks)){// 合并分片并加密存储mergeChunks(md5);encryptFile(md5);// SM4加密}returnResponseEntity.ok().build();}2.2 加密存储(前端示例)
// crypto-util.js (SM4加密)importSm4from'sm-crypto/lib/sm4';exportfunctionencryptFile(file,key){returnnewPromise((resolve)=>{constreader=newFileReader();reader.onload=(e)=>{constencrypted=Sm4.encrypt(e.target.result,key);resolve(newBlob([encrypted]));};reader.readAsArrayBuffer(file);});}2.3 断点续传(前端核心逻辑)
// upload-service.jsasyncfunctionresumeUpload(file,md5){constprogress=awaitgetProgressFromServer(md5);constchunks=createFileChunks(file);for(leti=0;i<chunks.length;i++){if(!progress[i]){awaituploadChunk(chunks[i],md5,i);}}// 最终合并请求awaitfetch('/upload/merge',{method:'POST',body:JSON.stringify({md5,totalChunks:chunks.length})});}三、兼容性解决方案
3.1 IE8兼容方案
3.2 信创环境适配
# 国产Linux构建镜像 FROM uos:20 RUN apt-get update && apt-get install -y openjdk-11-jre COPY target/app.jar /app.jar CMD ["java", "-jar", "/app.jar"]四、部署与集成
4.1 动态存储配置(application.yml)
storage:type:${STORAGE_TYPE:obs}# 支持obs/local/s3obs:access-key:${OBS_ACCESS_KEY}secret-key:${OBS_SECRET_KEY}endpoint:${OBS_ENDPOINT}local:base-path:/data/files4.2 数据库兼容配置
// DatabaseConfig.java@ConfigurationpublicclassDatabaseConfig{@Bean@ConfigurationProperties(prefix="spring.datasource")publicDataSourcedataSource(){if("dm".equalsIgnoreCase(dbType)){returnnewDmDataSource();// 达梦数据库}elseif("kingbase".equalsIgnoreCase(dbType)){returnnewKingbaseDataSource();}returnnewHikariDataSource();}}五、厂商合作要求
5.1 交付物清单
- 完整源码(含前后端、编译脚本)
- 国产化适配认证报告(麒麟/统信UOS)
- 加密算法合规证明(SM4商用许可)
- 5个以上央企合作案例(需提供合同关键页)
- 7×24小时技术支持承诺书
5.2 预算分配
| 项目 | 金额(万元) | 说明 |
|---|---|---|
| 源码授权 | 120 | 永久使用+商业许可 |
| 定制开发 | 30 | 兼容IE8/信创环境适配 |
| 技术培训 | 10 | 5次现场培训(每次2天) |
| 合计 | 160 |
六、实施计划
- 需求确认(2周):完成详细需求规格说明书
- POC验证(4周):实现核心功能原型
- 国产化适配(6周):完成信创环境认证
- 全量交付(8周):提供完整源码及文档
- 培训支持(2周):现场技术转移
本方案已通过集团技术委员会评审,现进入商务选型阶段,欢迎符合要求的厂商提交正式方案及报价。
SQL示例
创建数据库
配置数据库连接
自动下载maven依赖
启动项目
启动成功
访问及测试
默认页面接口定义
在浏览器中访问
数据表中的数据
效果预览
文件上传
文件刷新续传
支持离线保存文件进度,在关闭浏览器,刷新浏览器后进行不丢失,仍然能够继续上传
文件夹上传
支持上传文件夹并保留层级结构,同样支持进度信息离线保存,刷新页面,关闭页面,重启系统不丢失上传进度。
批量下载
支持文件批量下载
下载续传
文件下载支持离线保存进度信息,刷新页面,关闭页面,重启系统均不会丢失进度信息。
文件夹下载
支持下载文件夹,并保留层级结构,不打包,不占用服务器资源。
示例下载
下载完整示例