news 2026/4/18 3:52:13

前端如何通过AJAX实现.NET Core大文件分片上传的并行处理?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
前端如何通过AJAX实现.NET Core大文件分片上传的并行处理?

(抱紧保温杯在星巴克敲键盘版)
各位同行好!我是上海某咖啡馆·野生.NET程序员·刚搞懂IIS怎么念的·代码民工·秃头预备役。最近接了个"史诗级"外包项目,客户要求实现20G文件夹上传下载,现在每天的状态be like:

💻 前端:Vue3 + 原生JS魔改
🖥️ 后端:ASP.NET WebForm(连MVC都不敢用)
📂 数据库:SQL Server(存储文件元数据)
💰 预算:100元(含咖啡续命钱)


🎯 前端の求生指南(Vue3 + 原生JS兼容IE8版)

// 兼容IE8的文件夹上传组件(基于WebUploader魔改)classIE8FolderUploader{constructor(){this.fileTree={};// 存储文件层级结构this.chunkSize=10*1024*1024;// 10MB分片(IE8友好)this.initFileInput();// 初始化文件选择控件}// 初始化文件输入(兼容IE8的降级方案)initFileInput(){constinput=document.createElement('input');input.type='file';input.id='folderInput';input.style.display='none';// IE8专用:通过document.createEventObject模拟事件if(document.all&&!window.atob){input.setAttribute('multiple','multiple');input.onchange=(e)=>this.handleIE8Files(e);}else{input.setAttribute('webkitdirectory','');input.onchange=(e)=>this.handleModernFiles(e);}document.body.appendChild(input);}// IE8文件处理(递归遍历伪文件夹结构)handleIE8Files(event){constfiles=event.target.files;constfakeTree={};// IE8无法获取真实路径,用文件名模拟层级(如"部门A/项目1/文件.txt")for(leti=0;i<files.length;i++){constpathParts=files[i].name.split('/');letcurrentNode=fakeTree;// 递归构建虚拟目录for(letj=0;j<pathParts.length-1;j++){constdir=pathParts[j];if(!currentNode[dir])currentNode[dir]={};currentNode=currentNode[dir];}constfileName=pathParts.pop();currentNode[fileName]=files[i];// 存储文件对象}this.fileTree=fakeTree;this.startUpload();}// 现代浏览器文件夹处理handleModernFiles(event){constfiles=event.target.files;constrealTree={};for(leti=0;i<files.length;i++){constfile=files[i];constpath=file.webkitRelativePath||file.name;constparts=path.split('/');letnode=realTree;// 构建真实目录结构for(letj=0;j<parts.length-1;j++){constdir=parts[j];if(!node[dir])node[dir]={};node=node[dir];}node[parts.pop()]=file;}this.fileTree=realTree;this.startUpload();}// 分片上传(带断点续传)startUpload(){// 使用userData(IE8专属)存储进度conststorage=window.localStorage||(function(){constdiv=document.createElement('div');div.addBehavior('#default#userData');document.body.appendChild(div);return{setItem:(key,value)=>{div.setAttribute(key,value);div.save('uploader');},getItem:(key)=>div.getAttribute(key)};})();this.traverseTree(this.fileTree,'',storage);}// 递归遍历文件树traverseTree(node,parentPath,storage){for(constkeyinnode){if(node[key]instanceofFile){constfile=node[key];constrelativePath=parentPath?`${parentPath}/${key}`:key;constfileId=this.generateFileId(file,relativePath);// 检查断点续传进度constsavedChunk=parseInt(storage.getItem(`chunk_${fileId}`)||'0');consttotalChunks=Math.ceil(file.size/this.chunkSize);for(leti=savedChunk;i<totalChunks;i++){constblob=file.slice(i*this.chunkSize,(i+1)*this.chunkSize);constformData=newFormData();formData.append('file',blob);formData.append('chunkIndex',i);formData.append('totalChunks',totalChunks);formData.append('fileId',fileId);formData.append('relativePath',relativePath);// IE8专用:使用ActiveXObject发送请求constxhr=window.XMLHttpRequest?newXMLHttpRequest():newActiveXObject("Microsoft.XMLHTTP");xhr.open('POST','/api/upload',true);xhr.onload=()=>{if(xhr.status===200){storage.setItem(`chunk_${fileId}`,i+1);if(i===totalChunks-1){console.log(`${relativePath}上传完成!`);}}};xhr.send(formData);}}else{// 递归处理子目录this.traverseTree(node[key],`${parentPath}/${key}`,storage);}}}}// 在Vue组件中使用exportdefault{mounted(){this.uploader=newIE8FolderUploader();},methods:{triggerUpload(){document.getElementById('folderInput').click();}}}

💡 后端の求生代码(ASP.NET WebForm版)

// 文件上传处理(WebForm后台代码)publicpartialclassUploadHandler:System.Web.UI.Page{protectedvoidPage_Load(objectsender,EventArgse){if(Request.HttpMethod=="POST"){try{// 获取参数varfileId=Request.Form["fileId"];varchunkIndex=int.Parse(Request.Form["chunkIndex"]);vartotalChunks=int.Parse(Request.Form["totalChunks"]);varrelativePath=Request.Form["relativePath"];// 获取文件分片varfile=Request.Files["file"];vartempPath=Server.MapPath($"~/App_Data/Temp/{fileId}_{chunkIndex}");file.SaveAs(tempPath);// 如果是最后一个分片,合并文件if(chunkIndex==totalChunks-1){MergeChunks(fileId,totalChunks,relativePath);Response.Write("{\"status\":\"complete\"}");}else{Response.Write("{\"status\":\"success\"}");}}catch(Exceptionex){Response.Write($"{{\"error\":\"{ex.Message}\"}}");}}}privatevoidMergeChunks(stringfileId,inttotalChunks,stringrelativePath){vartempDir=Server.MapPath($"~/App_Data/Temp/");varfinalPath=Server.MapPath($"~/Uploads/{relativePath}");// 确保目录存在vardir=Path.GetDirectoryName(finalPath);if(!Directory.Exists(dir))Directory.CreateDirectory(dir);// 合并分片using(varfs=newFileStream(finalPath,FileMode.Create)){for(inti=0;i<totalChunks;i++){varchunkPath=Path.Combine(tempDir,$"{fileId}_{i}");varbytes=File.ReadAllBytes(chunkPath);fs.Write(bytes,0,bytes.Length);File.Delete(chunkPath);// 清理临时文件}}// 加密存储(示例:AES加密)EncryptFile(finalPath);}privatevoidEncryptFile(stringfilePath){// 实际项目中替换为SM4/AES加密实现// 这里仅作示例,实际加密需使用BouncyCastle等库File.WriteAllText(filePath+".enc","加密后的内容占位符");File.Delete(filePath);}}

📢 紧急求助(预算100元版)

当前系统存在以下要命问题

  1. IE8加密传输ActiveXObject无法直接处理加密(求C#端解密方案)
  2. 万级文件下载:非打包下载会触发浏览器连接数限制(求分批次下载方案)
  3. 断点续传可靠性:重启电脑后userData可能丢失(求SQL Server进度存储方案)

求各位大佬加群374992201拯救!现在入群可享:

  • 免费获得《如何在100元预算下完成外包项目》电子书
  • 参与"帮同行改BUG"活动赢取辣条基金
  • 推荐项目成功送《如何优雅拒绝客户改需求》秘籍

(突然正经)PS:真的求后端师傅!本人擅长:

  • 熬夜改前端兼容性问题
  • 写注释骗客户验收
  • PPT画大饼
  • 帮师傅买咖啡

联系方式:QQ群374992201(暗号:我要接单)
群内活动:

  1. 新人入群送1-99元红包
  2. 推荐项目得20%分成
  3. 超级会员享50%利润(未来项目)

**求同行推荐项目!**本人要求不高:

  • 预算够买咖啡
  • 客户不频繁改需求
  • 能用VS2022开发
  • 合同款能按时结的优先

(最后喊话)甲方爸爸们看过来!

  • 可提供100元预算的完整解决方案
  • 支持IE8到Edge全浏览器
  • 赠送7×24小时人工智障客服
  • 现在签约送《如何让客户放弃加密功能》话术手册!

设置框架

安装.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/4/18 0:22:31

MASM 中的 ADD 指令详解

文章目录MASM 中的 ADD 指令详解一、基本格式二、操作数组合规则三、操作数尺寸支持四、对标志位的影响五、具体示例示例1&#xff1a;寄存器与立即数示例2&#xff1a;寄存器与寄存器示例3&#xff1a;内存操作示例4&#xff1a;带进位的连续加法六、特殊用法1. 地址计算2. 数…

作者头像 李华
网站建设 2026/4/18 8:49:08

揭秘Open-AutoGLM如何实现发票0误差自动归档:AI驱动的财税新革命

第一章&#xff1a;揭秘Open-AutoGLM如何实现发票0误差自动归档&#xff1a;AI驱动的财税新革命在传统财务流程中&#xff0c;发票归档长期依赖人工录入与分类&#xff0c;不仅效率低下&#xff0c;还极易因人为疏忽导致数据错误。Open-AutoGLM 的出现彻底改变了这一局面。该系…

作者头像 李华
网站建设 2026/4/17 22:21:26

10个AI论文工具,助研究生高效完成毕业论文!

10个AI论文工具&#xff0c;助研究生高效完成毕业论文&#xff01; AI 工具如何改变论文写作的未来 在研究生阶段&#xff0c;撰写毕业论文是一项既复杂又耗时的任务。从选题到开题&#xff0c;再到撰写初稿和反复修改&#xff0c;每一个环节都对学生的学术能力和时间管理提出了…

作者头像 李华
网站建设 2026/4/18 6:31:06

【紧急预警】传统IoT控制架构即将淘汰?Open-AutoGLM已全面接管

第一章&#xff1a;Open-AutoGLM物联网设备联动控制的革命性突破Open-AutoGLM 作为新一代开源自动化语言模型框架&#xff0c;首次将大语言模型的推理能力与物联网&#xff08;IoT&#xff09;设备控制深度融合&#xff0c;实现了跨设备、跨协议的智能联动。其核心在于通过自然…

作者头像 李华