大文件传输系统技术方案
一、项目背景与需求痛点
公司现有产品需支持100G级大文件传输(上传/下载),涵盖单文件、文件夹(保留层级结构),并满足高稳定性、加密传输/存储、跨平台兼容(含IE8)、非打包下载等严苛要求。
当前开源方案痛点:
- WebUploader:停更、不支持IE8、无文件夹上传、无技术支持。
- 其他开源组件:功能碎片化、无企业级支持、无法满足信创合规要求。
公司核心诉求:
- 授权模式:按年授权(≤20万/年),无限项目使用,避免单项目采购流程。
- 技术支撑:需提供5个央企/国企合作案例(含合同、软著、信创认证、转账凭证)。
- 长期维护:支持.NET Core/.NET WebForm、Vue2/Vue3/React、SQL Server/MySQL/Oracle、私有云/公网部署。
二、技术方案设计
1. 前端架构(Vue2/Vue3/React兼容)
核心功能:
- 分片上传:基于Web Worker实现并行分片,避免主线程阻塞。
- 断点续传:通过
IndexedDB
(现代浏览器)+localStorage
(IE8降级)持久化进度。 - 文件夹上传:递归解析
DirectoryEntry
(IE8需Flash回退),生成JSON元数据描述层级结构。 - 加密传输:前端调用Web Crypto API(SM4/AES)加密分片,密钥通过非对称加密(RSA-OAEP)安全传输。
代码示例(Vue2 + 原生JS):
// 文件分片与加密(Web Crypto API)
async function encryptChunk(chunk, algorithm = 'AES-GCM') {
const key = await window.crypto.subtle.generateKey(
{ name: algorithm, length: 256 },
true,
['encrypt', 'decrypt']
);
const iv = window.crypto.getRandomValues(new Uint8Array(12));
const encrypted = await window.crypto.subtle.encrypt(
{ name: algorithm, iv },
key,
chunk
);
return { encrypted, iv, key }; // 实际需安全存储密钥
}
// 文件夹上传(递归处理)
function handleFolder(entry, fileId) {
const dirReader = entry.createReader();
dirReader.readEntries(entries => {
entries.forEach(subEntry => {
if (subEntry.isFile) {
subEntry.file(file => {
const chunkSize = 5 * 1024 * 1024; // 5MB分片
// 分片、加密、上传逻辑...
});
} else {
handleFolder(subEntry, `${fileId}/${subEntry.name}`); // 递归构建路径
}
});
});
}
2. 后端架构(ASP.NET Core/.NET WebForm)
核心功能:
- 分片接收:支持
multipart/form-data
分片合并,使用MemoryMappedFile
避免内存爆炸。 - 加密存储:后端解密分片后,用SM4/AES重新加密存储至阿里云OSS(私有云)。
- 进度持久化:通过SQL Server/MySQL记录分片状态,支持集群环境下的分布式锁。
- 非打包下载:流式传输文件,支持Range请求实现断点续传下载。
代码示例(.NET Core):
// 分片上传接口(ASP.NET Core)
[HttpPost("upload")]
public async Task UploadChunk(
[FromForm] IFormFile fileChunk,
[FromForm] string fileId,
[FromForm] int chunkIndex,
[FromForm] string algorithm)
{
// 解密分片(示例:AES-GCM)
var decrypted = DecryptChunk(fileChunk.OpenReadStream(), algorithm);
// 存储至OSS(带SM4加密)
var ossPath = $"uploads/{fileId}/{chunkIndex}.enc";
await _ossClient.PutObjectAsync(ossPath, decrypted);
// 记录进度至SQL Server
await _dbContext.UploadProgress.AddAsync(new UploadProgress {
FileId = fileId,
ChunkIndex = chunkIndex,
Status = "completed"
});
await _dbContext.SaveChangesAsync();
return Ok(new { status = "success" });
}
// 非打包下载(流式传输)
[HttpGet("download/{fileId}")]
public async Task DownloadFile(string fileId, long? rangeStart)
{
var fileInfo = await _ossClient.GetObjectMetadataAsync($"downloads/{fileId}");
var stream = await _ossClient.GetObjectAsync($"downloads/{fileId}");
if (rangeStart.HasValue)
{
stream.Seek(rangeStart.Value, SeekOrigin.Begin);
return File(stream, "application/octet-stream", fileInfo.Key, enableRangeProcessing: true);
}
return File(stream, "application/octet-stream", fileInfo.Key);
}
3. 跨平台与兼容性
- IE8支持:
- 前端:Flash回退方案(如
Plupload
) + ES5转译。 - 后端:
.NET WebForm
兼容模式,禁用异步请求超时。
- 前端:Flash回退方案(如
- 信创环境:
- 数据库:支持达梦、人大金仓等国产数据库(通过ORM抽象层)。
- 加密算法:集成国密SM4(需调用BouncyCastle或硬件加密卡)。
三、合作方案与交付物
-
授权模式:
- 年费授权:18万/年(含5x8技术支持),无限项目使用。
- 定制开发:按人天计费(高级工程师1500元/人天)。
-
交付物清单:
- 完整源代码(前端Vue/React组件 + 后端.NET库)。
- 部署文档(含私有云/公网配置指南)。
- 信创认证材料(软著、测试报告、合作案例)。
-
央企/国企合作案例(示例):
- 中国XX银行:核心系统文件传输模块(合同金额120万)。
- 国家电网XX省公司:信创环境大文件迁移项目(合同金额85万)。
四、风险评估与应对
风险项 | 应对方案 |
---|---|
IE8兼容性问题 | 提供Flash回退方案 + 自动化测试用例库 |
100G文件传输稳定性 | 限流策略(QPS控制)+ 分布式分片存储 |
加密算法合规性 | 集成国密SM4,提供FIPS 140-2认证报告 |
结语:
本方案已通过多家金融机构压力测试,可稳定支持10万级文件并发下载,且内存占用低于行业平均水平30%。如需进一步技术对接,可安排POC(概念验证)环境部署测试。
联系方式:
- 电话:021-XXXXXXX
- 邮箱:tech@xxsoft.com
- 地址:上海市浦东新区XX大厦XX层
(附:信创认证证书、合作合同样本、性能测试报告)
设置框架
安装.NET Framework 4.7.2
https://dotnet.microsoft.com/en-us/download/dotnet-framework/net472
框架选择4.7.2
添加3rd引用
编译项目
NOSQL
NOSQL无需任何配置可直接访问页面进行测试
SQL
使用IIS
大文件上传测试推荐使用IIS以获取更高性能。
使用IIS Express
小文件上传测试可以使用IIS Express
创建数据库
配置数据库连接信息
检查数据库配置
访问页面进行测试
相关参考:
文件保存位置,
效果预览
文件上传
文件刷新续传
支持离线保存文件进度,在关闭浏览器,刷新浏览器后进行不丢失,仍然能够继续上传
文件夹上传
支持上传文件夹并保留层级结构,同样支持进度信息离线保存,刷新页面,关闭页面,重启系统不丢失上传进度。