news 2026/5/28 13:52:17

.NET MVC如何设计大文件上传的交互界面与用户体验优化?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
.NET MVC如何设计大文件上传的交互界面与用户体验优化?

2023年10月15日 - 大文件上传系统开发日志

项目背景

今天正式接手了这个具有挑战性的文件上传系统项目。客户需求相当专业:需要支持20G大文件传输、文件夹层级结构保持、断点续传,还要兼容IE8这样的古董浏览器。作为个人开发者,这绝对是一个证明自己技术实力的好机会。

技术选型分析

经过一天的调研和验证,我确定了以下技术方案:

前端方案

  • 对于现代浏览器:使用HTML5 File API + IndexedDB实现
  • 对于IE8:使用Flash作为后备方案(虽然不情愿,但不得不支持)
  • 加密方案:使用CryptoJS实现SM4和AES加密
  • 进度管理:LocalStorage + Service Worker双保险

后端方案

  • 文件切片:10MB为一个chunk
  • 断点续传:SQL Server记录上传状态
  • 存储策略:阿里云OSS分片上传API
  • 加密存储:服务器端二次加密

核心代码片段

前端关键代码 (基于原生JS)

// 文件上传核心逻辑classBigFileUploader{constructor(){this.chunkSize=10*1024*1024;// 10MBthis.maxRetry=3;this.concurrentUploads=3;}// 处理文件夹上传asyncuploadFolder(folder,basePath=''){constentries=awaitthis.readDirectory(folder);for(letentryofentries){if(entry.isDirectory){awaitthis.uploadFolder(entry,`${basePath}/${entry.name}`);}else{awaitthis.uploadFile(entry.file,basePath);}}}// 文件分片上传asyncuploadFile(file,relativePath){consttotalChunks=Math.ceil(file.size/this.chunkSize);constfileId=this.generateFileId(file,relativePath);// 检查已上传的分片constuploadedChunks=awaitthis.checkUploadedChunks(fileId);for(letchunkIndex=0;chunkIndex<totalChunks;chunkIndex++){if(uploadedChunks.includes(chunkIndex))continue;constchunk=file.slice(chunkIndex*this.chunkSize,Math.min(file.size,(chunkIndex+1)*this.chunkSize));constencryptedChunk=this.encryptChunk(chunk);awaitthis.uploadChunk(fileId,chunkIndex,encryptedChunk);// 保存进度this.saveProgress(fileId,chunkIndex);}// 通知服务器完成上传awaitthis.completeUpload(fileId,totalChunks);}}

后端关键代码 (C# WebForm)

// 文件上传处理类publicclassFileUploadHandler:IHttpHandler{publicvoidProcessRequest(HttpContextcontext){stringaction=context.Request["action"];switch(action){case"upload":HandleChunkUpload(context);break;case"check":CheckChunkStatus(context);break;case"complete":CompleteFileUpload(context);break;}}privatevoidHandleChunkUpload(HttpContextcontext){stringfileId=context.Request["fileId"];intchunkIndex=int.Parse(context.Request["chunkIndex"]);// 获取加密分片数据StreamchunkStream=context.Request.InputStream;// 解密数据byte[]decryptedData=DecryptChunk(chunkStream,"SM4");// 存储到临时位置stringtempPath=GetChunkTempPath(fileId,chunkIndex);File.WriteAllBytes(tempPath,decryptedData);// 记录数据库RecordChunkUpload(fileId,chunkIndex,tempPath);}privatevoidCompleteFileUpload(HttpContextcontext){stringfileId=context.Request["fileId"];inttotalChunks=int.Parse(context.Request["totalChunks"]);// 验证所有分片是否完整if(!VerifyAllChunks(fileId,totalChunks)){context.Response.Write("{\"status\":\"error\", \"message\":\"Missing chunks\"}");return;}// 合并分片stringfinalPath=MergeChunks(fileId,totalChunks);// 上传到阿里云OSSUploadToOSS(finalPath);// 清理临时文件CleanTempFiles(fileId);context.Response.Write("{\"status\":\"success\"}");}}

今日技术难点与解决方案

  1. IE8兼容性问题

    • 方案:使用Flash作为后备方案,检测浏览器支持情况自动切换
    • 代码:通过条件注释加载不同版本的JS文件
  2. 大文件夹遍历性能

    • 问题:1000+文件的文件夹会导致UI冻结
    • 方案:使用Web Workers进行后台处理
    • 实现:将文件遍历逻辑放入Worker中
  3. 断点续传可靠性

    • 问题:浏览器关闭后如何恢复
    • 方案:LocalStorage + Service Worker双备份
    • 优化:定期将进度同步到服务器

明日计划

  1. 完成文件夹下载功能的非打包实现
  2. 测试各浏览器下的加密传输性能
  3. 编写SQL Server的存储过程优化分片查询
  4. 开始编写技术文档

项目感悟

这个项目确实很有挑战,但也是提升全栈能力的好机会。特别是对老浏览器的兼容,让我重新认识了渐进增强的重要性。希望最终交付的产品能让客户满意,也为自己积累一个重量级的案例。

PS:欢迎同行交流,我的QQ群:374992201,大家可以一起讨论技术难题,共享外包资源。


注:以上代码为关键部分示例,完整实现需要考虑更多边界条件和错误处理。实际开发中建议使用TypeScript增强代码可靠性。

设置框架

安装.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

创建数据库

配置数据库连接信息

检查数据库配置

访问页面进行测试


相关参考:
文件保存位置,

效果预览

文件上传

文件刷新续传

支持离线保存文件进度,在关闭浏览器,刷新浏览器后进行不丢失,仍然能够继续上传

文件夹上传

支持上传文件夹并保留层级结构,同样支持进度信息离线保存,刷新页面,关闭页面,重启系统不丢失上传进度。

下载完整示例

下载完整示例

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/27 22:01:44

揭秘Open-AutoGLM收益模型:如何用AI自动计算最优理财方案

第一章&#xff1a;揭秘Open-AutoGLM收益模型&#xff1a;如何用AI自动计算最优理财方案在金融智能化浪潮中&#xff0c;Open-AutoGLM作为一种基于大语言模型的自动化收益优化系统&#xff0c;正逐步改变传统理财策略的制定方式。该模型融合了时间序列预测、风险评估与资产配置…

作者头像 李华
网站建设 2026/5/28 6:45:28

6.6.ADC指令 代码示例

文章目录ADD指令不使用ADC导致多精度运算错误的示例64位加法汇编程序详解程序结构概述场景一&#xff1a;基本64位加法代码片段&#xff1a;问题与结果&#xff1a;场景二&#xff1a;边界值测试代码片段&#xff1a;问题与结果&#xff1a;场景三&#xff1a;三个数连续相加问…

作者头像 李华
网站建设 2026/5/20 14:36:10

LangFlow在智能客服中的应用案例分享

LangFlow在智能客服中的应用案例分享 在客户服务领域&#xff0c;企业正面临一个日益严峻的挑战&#xff1a;用户期望获得即时、精准且个性化的响应&#xff0c;而传统人工客服受限于人力成本与响应速度&#xff0c;难以满足全天候高并发的服务需求。与此同时&#xff0c;大语言…

作者头像 李华
网站建设 2026/5/27 5:26:23

揭秘Open-AutoGLM弹窗无法关闭真相:99%开发者忽略的底层机制

第一章&#xff1a;揭秘Open-AutoGLM弹窗无法关闭的真相在使用 Open-AutoGLM 插件过程中&#xff0c;部分用户反馈弹窗界面在触发后无法正常关闭&#xff0c;严重影响开发体验。该问题并非由插件本身崩溃导致&#xff0c;而是与事件监听机制和 DOM 生命周期管理不当密切相关。问…

作者头像 李华
网站建设 2026/5/27 5:02:05

基于YOLOv12的杂草识别检测系统(YOLOv12深度学习+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)

一、项目介绍 针对农田杂草高效识别与精准防控的需求&#xff0c;本研究基于深度学习目标检测算法YOLOv12&#xff0c;开发了一套杂草识别检测系统。系统以12类常见杂草&#xff08;如鳢肠、牵牛、牛筋草等&#xff09;为检测对象&#xff0c;构建包含2796张训练图像和523张验…

作者头像 李华