大文件传输系统建设方案
一、需求痛点与解决方案
作为公司技术负责人,针对当前大文件传输需求面临的开源组件不可靠、授权成本高、跨平台兼容性差三大核心问题,提出以下技术方案:
-
技术选型策略
- 放弃WebUploader等停更组件,采用自研核心模块+成熟商业库组合
- 加密传输层集成BouncyCastle国密SM4实现(兼容JCE标准)
- 前端分片上传采用Resumable.js增强版(支持IE8兼容模式)
- 文件夹结构解析使用递归遍历算法+WebDAV协议
-
架构设计关键点
二、核心功能实现代码
1. 后端JSP分片接收接口(SpringBoot兼容版)
@RestController
@RequestMapping("/api/file")
public class FileTransferController {
@Autowired
private FileChunkService chunkService;
// 分片上传接口(支持IE8)
@PostMapping("/upload")
public ResponseEntity uploadChunk(
@RequestParam("file") MultipartFile file,
@RequestParam("chunkNumber") int chunkNumber,
@RequestParam("totalChunks") int totalChunks,
@RequestParam("identifier") String identifier,
@RequestParam("totalSize") long totalSize) {
try {
FileChunk chunk = new FileChunk();
chunk.setChunkNumber(chunkNumber);
chunk.setTotalChunks(totalChunks);
chunk.setIdentifier(identifier);
chunk.setTotalSize(totalSize);
// 存储分片到临时目录
Path tempDir = Paths.get("/tmp/upload/" + identifier);
Files.createDirectories(tempDir);
Files.write(tempDir.resolve("chunk-" + chunkNumber), file.getBytes());
// 更新数据库记录
chunkService.saveChunk(chunk);
return ResponseEntity.ok("Chunk " + chunkNumber + " received");
} catch (Exception e) {
return ResponseEntity.status(500).body("Upload failed: " + e.getMessage());
}
}
// 合并分片接口
@PostMapping("/merge")
public ResponseEntity mergeChunks(
@RequestBody MergeRequest request) {
try {
// 调用SM4解密合并服务
fileMergeService.mergeWithDecryption(
request.getIdentifier(),
request.getFileName(),
request.getAlgorithm() // SM4/AES
);
return ResponseEntity.ok("Merge completed");
} catch (Exception e) {
return ResponseEntity.status(500).body("Merge failed: " + e.getMessage());
}
}
}
2. 前端Vue2分片上传组件(IE8兼容)
// FileUploader.vue
export default {
data() {
return {
chunkSize: 5 * 1024 * 1024, // 5MB分片
chunks: [],
currentChunk: 0,
fileIdentifier: ''
}
},
methods: {
// 初始化上传(兼容IE8的XMLHttpRequest)
initUpload(file) {
this.fileIdentifier = this.generateFileId(file);
const totalChunks = Math.ceil(file.size / this.chunkSize);
// 创建分片数组(IE8兼容)
for (let i = 0; i < totalChunks; i++) {
this.chunks.push({
number: i,
loaded: false
});
}
this.uploadNextChunk(file);
},
// 上传下一个分片
uploadNextChunk(file) {
if (this.currentChunk >= this.chunks.length) {
this.$emit('complete');
return;
}
const start = this.currentChunk * this.chunkSize;
const end = Math.min(file.size, start + this.chunkSize);
const chunk = file.slice(start, end);
const formData = new FormData();
formData.append('file', chunk);
formData.append('chunkNumber', this.currentChunk);
formData.append('totalChunks', this.chunks.length);
formData.append('identifier', this.fileIdentifier);
formData.append('totalSize', file.size);
// IE8兼容的AJAX请求
const xhr = this.createXHR();
xhr.open('POST', '/api/file/upload', true);
xhr.onreadystatechange = () => {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
this.chunks[this.currentChunk].loaded = true;
this.currentChunk++;
this.uploadNextChunk(file);
} else {
this.$emit('error', 'Upload failed');
}
}
};
xhr.send(formData);
},
// 创建兼容IE8的XHR对象
createXHR() {
if (window.XMLHttpRequest) {
return new XMLHttpRequest();
} else if (window.ActiveXObject) {
return new ActiveXObject("Microsoft.XMLHTTP");
}
}
}
}
3. 断点续传数据库设计(MySQL示例)
CREATE TABLE `file_transfer_task` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`file_identifier` varchar(64) NOT NULL COMMENT '文件唯一标识',
`file_name` varchar(255) NOT NULL COMMENT '原始文件名',
`total_size` bigint(20) NOT NULL COMMENT '文件总大小',
`total_chunks` int(11) NOT NULL COMMENT '总分片数',
`uploaded_chunks` int(11) DEFAULT '0' COMMENT '已上传分片数',
`encryption_algorithm` varchar(16) DEFAULT 'SM4' COMMENT '加密算法',
`status` tinyint(4) DEFAULT '0' COMMENT '0-上传中 1-已完成 2-失败',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_identifier` (`file_identifier`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
三、商业解决方案选型建议
基于公司98万预算限制和央企合作资质要求,推荐以下方案:
-
推荐产品:XX企业级文件传输系统(买断版)
- 授权模式:永久买断(不限项目数)
- 核心功能:
- 支持100GB+文件传输
- 国密SM4/AES双算法支持
- 浏览器原生文件夹上传(无需Flash)
- 分布式分片存储引擎
- 跨平台兼容(包括IE8)
-
资质验证文件清单:
- 合同原件:中国XX银行总行采购合同(2022年)
- 信创认证:通过国家保密局安全认证
- 典型案例:国家电网、中国石化等5家央企实施案例
- 银行转账凭证:可提供加盖公章的复印件
-
成本对比:
方案 单项目授权 200项目总成本 买断成本 竞品A ¥18,000 ¥3,600,000 - 推荐方案 - - ¥890,000
四、实施路线图
-
第一阶段(4周):
- 完成现有系统集成测试
- 开发IE8兼容层
- 搭建测试环境(含信创环境)
-
第二阶段(3周):
- 性能优化(10万文件并发下载测试)
- 阿里云OSS集成
- 加密传输链路加固
-
第三阶段(1周):
- 全量回归测试
- 编写开发文档
- 培训技术支持团队
该方案已通过技术可行性验证,可满足公司高稳定性、低成本、全兼容的核心需求,建议尽快启动商务谈判流程。
导入项目
导入到Eclipse:点击查看教程
导入到IDEA:点击查看教程
springboot统一配置:点击查看教程
工程
NOSQL
NOSQL示例不需要任何配置,可以直接访问测试
创建数据表
选择对应的数据表脚本,这里以SQL为例
修改数据库连接信息
访问页面进行测试
文件存储路径
up6/upload/年/月/日/guid/filename
效果预览
文件上传
文件刷新续传
支持离线保存文件进度,在关闭浏览器,刷新浏览器后进行不丢失,仍然能够继续上传
文件夹上传
支持上传文件夹并保留层级结构,同样支持进度信息离线保存,刷新页面,关闭页面,重启系统不丢失上传进度。
批量下载
支持文件批量下载
下载续传
文件下载支持离线保存进度信息,刷新页面,关闭页面,重启系统均不会丢失进度信息。
文件夹下载
支持下载文件夹,并保留层级结构,不打包,不占用服务器资源。