Elasticsearch集群架构调优:从入门到生产级实战,全维度性能提升攻略
2026/4/28 21:03:33
2023年X月X日 开发日志 - 大文件传输系统攻坚实录
凌晨1:30,合肥的暴雨敲打着窗户,我正在为这个极具挑战的外包项目设计技术方案。客户的需求相当硬核——基于WebUploader实现20G级文件夹传输,还要兼容IE8这个"上古神器"。泡了杯浓茶,记录下今天的突破性进展。
通过分析Windows/MacOS的目录选择行为,发现隐藏的webkitdirectory属性:
配套的Vue3处理逻辑:
// folder-processor.jsexportconstscanFolder=(entries,path='')=>{constitems=[]for(constentryofentries){constitem={path:path+entry.name,isFile:entry.isFile}if(entry.isFile){item.file=entry items.push(item)}else{items.push({...item,children:awaitscanFolder(awaitreadDirectory(entry),path+entry.name+'/')})}}returnitems}采用三级缓存机制确保可靠性:
// C# 断点状态服务publicclassUploadStateService{privatereadonlystring_connStr;publicasyncTaskGetStateAsync(stringfileKey){usingvarconn=newSqlConnection(_connStr);returnawaitconn.QueryFirstOrDefaultAsync(@"SELECT * FROM UploadStates WHERE FileKey = @fileKey AND UserId = @userId",new{fileKey,UserContext.Current.UserId});}publicasyncTaskSaveChunkAsync(FileChunkchunk){// 采用UPSERT模式varsql=@" MERGE INTO UploadChunks AS target USING (VALUES (@chunkId, @fileKey, @chunkNumber)) AS source(...) ON target.ChunkId = source.chunkId WHEN MATCHED THEN UPDATE SET ... WHEN NOT MATCHED THEN INSERT (...) VALUES (...)";awaitconn.ExecuteAsync(sql,chunk);}}利用阿里云OSS的列举和签名机制:
// FileController.cs[HttpGet("download")]publicasyncTaskDownloadFolder(stringpath){varobjects=await_ossService.ListObjectsAsync(path);varmanifest=objects.Select(o=>new{Key=o.Key,Url=_ossService.GeneratePresignedUrl(o.Key)});returnJson(new{Type="folder",Manifest=manifest,BasePath=path});}前端处理逻辑:
// download-manager.jsexportconstdownloadFolder=async(manifest)=>{for(constitemofmanifest){constrelativePath=item.Key.replace(manifest.BasePath,'')awaitcreateLocalDirectory(relativePath)constresponse=awaitfetch(item.Url)constblob=awaitresponse.blob()saveAs(blob,relativePath.split('/').pop())}}在QQ群(374992201)里与几位前辈探讨后,采用以下黑科技:
// ie8-compat.jsdocument.attachEvent('onclick',function(){if(window.ActiveXObject){// 使用古老的FileSystemObjectvarfso=newActiveXObject("Scripting.FileSystemObject")varfolder=fso.GetFolder(selectedPath)traverseFolder(folder)}})functiontraverseFolder(folder){varfiles=newEnumerator(folder.files)for(;!files.atEnd();files.moveNext()){postFile(files.item())}varsubfolders=newEnumerator(folder.subfolders)for(;!subfolders.atEnd();subfolders.moveNext()){traverseFolder(subfolders.item())}}深夜的键盘声格外清晰,这个项目让我深刻体会到——兼容IE8就像考古学家修复青铜器,需要特殊的工具和极大的耐心。明天将继续完善分片合并逻辑,或许该考虑引入Web Worker来避免界面卡顿…
(文档持续更新中,完整代码请关注QQ群文件更新)
安装.NET Framework 4.7.2
https://dotnet.microsoft.com/en-us/download/dotnet-framework/net472
框架选择4.7.2
NOSQL无需任何配置可直接访问页面进行测试
使用IIS
大文件上传测试推荐使用IIS以获取更高性能。
小文件上传测试可以使用IIS Express
相关参考:
文件保存位置,
支持离线保存文件进度,在关闭浏览器,刷新浏览器后进行不丢失,仍然能够继续上传
支持上传文件夹并保留层级结构,同样支持进度信息离线保存,刷新页面,关闭页面,重启系统不丢失上传进度。
下载完整示例