有没有做ppt好看的免费网站,泉州手机网站开发,做app公司一般叫什么公司,服务器维护是怎么维护的【一个C#外包仔的2G文件上传生死劫#xff1a;从WebUploader到.NET Core自救指南】 老板#xff0c;这个需求…可能需要加钱。“我盯着客户发来的PDF#xff0c;手指在支持2G文件批量上传那行字上疯狂颤抖。作为同时会修打印机和写ASP.NET Core的全…【一个C#外包仔的2G文件上传生死劫从WebUploader到.NET Core自救指南】老板这个需求…可能需要加钱。“我盯着客户发来的PDF手指在支持2G文件批量上传那行字上疯狂颤抖。作为同时会修打印机和写ASP.NET Core的全栈艺术家”我深知这次要面对的是三重暴击Vue2的兼容性、SQL Server的存储压力还有那个该死的WebUploader——它现在就像个被拔掉电池的玩具在控制台里躺着闪红灯。第一幕WebUploader的临终表演看它动了我兴奋地指着屏幕上突然跳到99%的进度条下一秒Chrome标签页就白屏了。这个百度开源的组件就像个行为艺术家分片上传能工作但偶尔会把第13片传到火星后来发现是Nginx的client_max_body_size在作怪跨浏览器兼容在Edge里会表演进度条卡顿魔术在Firefox里直接显示NaN%断点续传客户重启路由器后所有分片都会集体玩消失的她最绝的是错误处理// 前端发来的神秘代码uploader.on(error,function(type){if(typeF_DUPLICATE){alert(文件已存在但后端可能没收到这个消息);}else{console.log(出错了但我不知道怎么描述);}});第二幕.NET Core与Vue2的跨服聊天前端说需要获取上传速度我冲着电话大喊嘴里还嚼着辣条。后端小哥其实也是我的声线透着绝望“哥WebUploader的文档比我的C#注释还抽象…”于是我们开启了量子纠缠式开发// 后端API喝到第五杯咖啡后的产物[HttpPost(upload-chunk)]publicasyncTaskUploadChunk(IFormFilefile,stringfileHash,intchunkIndex){try{varchunkPathPath.Combine(uploads,fileHash,${chunkIndex}.part);awaitusingvarstreamnewFileStream(chunkPath,FileMode.Create);awaitfile.CopyToAsync(stream);// 偶尔会抛出神秘异常returnOk(new{successtrue});// 其实可能没成功}catch{returnStatusCode(500,服务器说它累了);}}// 前端调用Vue2的魔法uploadChunk(chunk){constformDatanewFormData();formData.append(file,chunk.file);formData.append(fileHash,this.fileHash);formData.append(chunkIndex,chunk.index);axios.post(/api/upload-chunk,formData,{onUploadProgress:(){// 这个回调会随机触发3次}});}第三幕SQL Server的内存爆炸当客户问能不能显示所有上传任务的历史记录时我盯着那台只有8G内存的云服务器陷入了沉思-- 最初的设计天真版CREATETABLEUploadTasks(Id UNIQUEIDENTIFIERPRIMARYKEY,FileName NVARCHAR(255),FileSizeBIGINT,-- 2G文件就是2147483648StatusINT,-- 0上传中 1完成 2失败 3合并中...CreatedAt DATETIME2,-- 省略了5个关联表的设计...);直到测试时发现插入1000条记录后查询进行中的任务需要2.8秒没有给FileHash列加索引别问我怎么知道的当Nginx超时断开连接时.NET Core还在傻乎乎地插入分片记录合并文件时FileStream直接吃掉了4G内存第四幕绝地求生方案经过三天三夜的谷歌搜索和两包卫龙辣条我制定了新方案前端改造计划弃用WebUploader改用uppy.io至少文档是2024年的实现真正的断点续传// 用IndexedDB存储已上传分片constdbPromiseidb.open(UploadDB,1,upgradeDB{upgradeDB.createObjectStore(chunks,{keyPath:id});});添加心跳检测防止浏览器假死用WebSocket实时显示上传速度虽然.NET Core的SignalR更香但学不动啊后端自救指南用MemoryMappedFile替代普通FileStream处理大文件// 合并分片时不再吃内存using(varmmfMemoryMappedFile.CreateFromFile(final.dat,FileMode.Create)){for(inti0;itotalChunks;i){varchunkPathPath.Combine(uploads,fileHash,${i}.part);// 内存映射文件操作...}}添加速率限制中间件// 防止客户端疯狂上传app.Use(async(context,next){varclientIpcontext.Connection.RemoteIpAddress;varrateLimitKey$upload:{clientIp};// 简单的Redis计数器实际用StackExchange.Redisif(redis.Increment(rateLimitKey)100){context.Response.StatusCode429;awaitcontext.Response.WriteAsync(慢点兄弟);return;}awaitnext();});异步处理文件合并// 用Hangfire后台任务_backgroundJobClient.Schedule(()MergeFile(fileHash),TimeSpan.FromMinutes(1)// 延迟1分钟合并给前端时间传完所有分片);数据库优化改用SQL Server的FILESTREAM存储大文件元数据添加Redis缓存当前上传任务对大文件记录采用软删除策略标记为删除但不真删怕客户反悔分表策略-- 按年份分表CREATETABLEUploadTasks_2024(-- 结构同主表);终幕测试日的疯狂当客户终于发来测试文件时我的监控面板是这样的IIS错误日志每分钟新增5条Connection_Abandoned_By_ReqQueue.NET Core内存占用突破1.8GSQL Server慢查询日志里全是SELECT * FROM UploadTasks WHERE Status0但当那个2.1G的《Windows 11 ISO》终于显示上传成功时我激动得把可乐打翻在键盘上——至少这次没把服务器宕机只是让整个办公室的鼠标都变得黏糊糊的…客户反馈IE11下进度条会跳《极乐净土》。我微笑.jpg 并默默在Nginx配置里加了if ($http_user_agent ~* MSIE) { return 403; }设置框架安装.NET Framework 4.7.2https://dotnet.microsoft.com/en-us/download/dotnet-framework/net472框架选择4.7.2添加3rd引用编译项目NOSQLNOSQL无需任何配置可直接访问页面进行测试SQL使用IIS大文件上传测试推荐使用IIS以获取更高性能。使用IIS Express小文件上传测试可以使用IIS Express创建数据库配置数据库连接信息检查数据库配置访问页面进行测试相关参考文件保存位置效果预览文件上传文件刷新续传支持离线保存文件进度在关闭浏览器刷新浏览器后进行不丢失仍然能够继续上传文件夹上传支持上传文件夹并保留层级结构同样支持进度信息离线保存刷新页面关闭页面重启系统不丢失上传进度。批量下载支持文件批量下载下载续传文件下载支持离线保存进度信息刷新页面关闭页面重启系统均不会丢失进度信息。文件夹下载支持下载文件夹并保留层级结构不打包不占用服务器资源。下载完整示例下载完整示例