大文件传输系统建设方案
一、需求分析与技术选型
作为项目负责人,针对公司核心需求,需解决以下关键技术挑战:
- 跨平台兼容性:需兼容IE8等老旧浏览器及Windows 7环境
- 高并发稳定性:避免传统打包下载导致的内存溢出问题
- 信创合规性:支持SM4国密算法及信创环境认证
- 商业授权模式:98万买断授权,需验证供应商资质
经技术委员会评估,决定采用自研核心模块+成熟商业组件的混合架构:
- 前端:基于Vue2/3+React的适配层抽象
- 传输层:集成WebSocket+分片传输协议
- 加密层:SM4/AES双算法动态切换引擎
- 存储层:阿里云OSS直传+本地缓存双通道
二、核心代码实现(关键模块)
1. 前端分片上传组件(Vue2示例)
// FileUploader.vue
export default {
data() {
return {
chunkSize: 5 * 1024 * 1024, // 5MB分片
fileMd5: '',
uploadTaskId: ''
}
},
methods: {
async calculateMd5(file) {
return new Promise((resolve) => {
const reader = new FileReader()
reader.onload = (e) => {
const spark = new SparkMD5.ArrayBuffer()
spark.append(e.target.result)
resolve(spark.end())
}
reader.readAsArrayBuffer(file.slice(0, 10 * 1024 * 1024)) // 取前10MB计算
})
},
async uploadFile(file) {
this.fileMd5 = await this.calculateMd5(file)
const totalChunks = Math.ceil(file.size / this.chunkSize)
// 检查断点
const resumeData = await this.checkResumePoint(this.fileMd5)
let startChunk = resumeData ? resumeData.lastChunk + 1 : 0
for (let i = startChunk; i < totalChunks; i++) {
const chunk = file.slice(i * this.chunkSize, (i + 1) * this.chunkSize)
const formData = new FormData()
formData.append('file', chunk)
formData.append('chunkIndex', i)
formData.append('totalChunks', totalChunks)
formData.append('fileMd5', this.fileMd5)
formData.append('taskId', this.uploadTaskId)
try {
await axios.post('/api/upload/chunk', formData, {
onUploadProgress: (e) => {
this.updateProgress(i, totalChunks, e.loaded)
}
})
} catch (error) {
console.error('Chunk upload failed:', error)
throw error
}
}
await this.mergeChunks(this.fileMd5, totalChunks)
},
// 兼容IE8的XMLHttpRequest实现
ie8Upload(file) {
// 实现略...(使用FileReader API分片读取)
}
}
}
2. 后端分片处理(Spring Boot示例)
@RestController
@RequestMapping("/api/upload")
public class UploadController {
@Autowired
private ChunkService chunkService;
@PostMapping("/chunk")
public ResponseEntity uploadChunk(
@RequestParam("file") MultipartFile file,
@RequestParam("chunkIndex") int chunkIndex,
@RequestParam("totalChunks") int totalChunks,
@RequestParam("fileMd5") String fileMd5,
@RequestParam("taskId") String taskId) {
try {
// 存储分片到临时目录
String tempPath = "/tmp/uploads/" + taskId + "/" + chunkIndex;
Files.write(Paths.get(tempPath), file.getBytes());
// 更新进度到Redis
redisTemplate.opsForValue().set(
"upload:progress:" + taskId,
String.format("%d/%d", chunkIndex + 1, totalChunks)
);
return ResponseEntity.ok().build();
} catch (IOException e) {
return ResponseEntity.status(500).build();
}
}
@PostMapping("/merge")
public ResponseEntity mergeChunks(
@RequestBody MergeRequest request) {
// SM4加密合并后的文件
byte[] encryptedData = SM4Util.encrypt(
request.getFileData(),
getEncryptionKey(request.getUserId())
);
// 存储到OSS
ossClient.putObject(
"your-bucket",
request.getFilePath(),
new ByteArrayInputStream(encryptedData)
);
return ResponseEntity.ok().build();
}
}
3. 断点续传持久化(MySQL示例)
CREATE TABLE upload_task (
task_id VARCHAR(64) PRIMARY KEY,
file_md5 VARCHAR(64) NOT NULL,
user_id VARCHAR(32) NOT NULL,
total_chunks INT NOT NULL,
completed_chunks INT DEFAULT 0,
status TINYINT DEFAULT 0 COMMENT '0:进行中 1:完成 2:失败',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_user_file (user_id, file_md5)
);
CREATE TABLE upload_chunk (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
task_id VARCHAR(64) NOT NULL,
chunk_index INT NOT NULL,
storage_path VARCHAR(255) NOT NULL,
UNIQUE KEY uk_task_chunk (task_id, chunk_index),
FOREIGN KEY (task_id) REFERENCES upload_task(task_id)
);
三、供应商评估标准
根据采购部门要求,需重点验证:
-
资质文件:
- 央企/国企合作案例(需提供合同首页+盖章页)
- 信创环境认证证书(包括龙芯/飞腾/鲲鹏等适配证明)
- 银行转账凭证(验证真实交易)
-
技术能力:
- 必须提供IE8兼容性测试报告
- 需演示10万级文件并发下载场景
- 支持SM4算法的FIPS 140-2认证文档
-
商务条款:
- 买断授权需明确包含源码交付
- 需提供5年免费升级服务
- 违约赔偿条款需覆盖系统稳定性
四、实施路线图
-
POC验证阶段(4周):
- 在测试环境部署供应商产品
- 完成100G文件传输压力测试
- 验证信创环境兼容性
-
集成开发阶段(8周):
- 开发JSP标签库封装核心功能
- 实现Vue/React适配层
- 完成MySQL到Oracle的数据库适配
-
试点推广阶段(4周):
- 选择3个典型项目进行试点
- 收集用户反馈优化体验
- 完成等保三级安全测评
五、风险控制
-
技术风险:
- 预留20%性能冗余设计
- 实现灰度发布机制
- 准备传统打包下载的降级方案
-
合规风险:
- 委托第三方进行代码审计
- 申请数据安全管理体系认证
- 签订数据保密协议
-
商务风险:
- 要求供应商提供银行履约保函
- 分阶段支付采购款项
- 保留10%尾款作为质保金
该方案已通过技术委员会评审,下一步将启动供应商招标流程。预计通过本方案可降低年度授权成本82%,同时将大文件传输成功率提升至99.99%,满足央企客户严苛的稳定性要求。
导入项目
导入到Eclipse:点击查看教程
导入到IDEA:点击查看教程
springboot统一配置:点击查看教程
工程

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

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


修改数据库连接信息

访问页面进行测试

文件存储路径
up6/upload/年/月/日/guid/filename


效果预览
文件上传

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

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

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

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

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


1050

被折叠的 条评论
为什么被折叠?



