大文件傳輸系統技術方案
一、項目背景與需求痛點
公司現有產品需支持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兼容模式,禁用異步請求超時。
- 信創環境:
- 數據庫:支持達夢、人大金倉等國產數據庫(通過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
創建數據庫
配置數據庫連接信息
檢查數據庫配置
訪問頁面進行測試
相關參考:
文件保存位置,
效果預覽
文件上傳
文件刷新續傳
支持離線保存文件進度,在關閉瀏覽器,刷新瀏覽器後進行不丟失,仍然能夠繼續上傳
文件夾上傳
支持上傳文件夾並保留層級結構,同樣支持進度信息離線保存,刷新頁面,關閉頁面,重啓系統不丟失上傳進度。