news 2026/7/29 20:20:03

.NET MVC如何设计大文件上传的权限控制与验证机制?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
.NET MVC如何设计大文件上传的权限控制与验证机制?

大文件上传系统开发指南(兼容IE8的Vue3+WebForm实现)

项目概述

嘿,兄弟!听说你接了个"不可能完成的任务"?20G文件上传、兼容IE8、还要保留文件夹结构?别慌,让我这个老江湖带你飞!虽然预算只有100块,但咱们程序员不就是喜欢挑战极限嘛!

系统架构

  • 前端:Vue3 CLI(但为了IE8兼容,我们得用点黑科技)
  • 后端:ASP.NET WebForm(SQL Server数据库)
  • 文件存储:服务器E盘
  • 传输加密:SM4/AES(前端加密,后端解密)
  • 断点续传:本地存储+服务器记录

前端实现(兼容IE8的"现代"方案)

1. 兼容IE8的Vue3环境搭建

大文件上传系统

2. 文件夹上传组件(原生JS实现)

// src/components/FolderUploader.vueexportdefault{data(){return{fileList:[],isUploading:false,chunkSize:5*1024*1024,// 5MB每片encryptKey:'this-is-a-32-byte-key-for-aes-256'// 实际项目中应该从服务器获取}},methods:{triggerFileInput(){document.getElementById('fileInput').click();},uploadChunk(relativePath,chunk,chunkIndex,totalChunks,totalSize,fileObj){returnnewPromise((resolve,reject)=>{constformData=newFormData();formData.append('filePath',relativePath);formData.append('chunkIndex',chunkIndex);formData.append('totalChunks',totalChunks);formData.append('totalSize',totalSize);formData.append('chunk',newBlob([chunk]));formData.append('fileId',this.generateFileId(fileObj.file));constxhr=newXMLHttpRequest();xhr.open('POST','/api/Upload/UploadChunk',true);xhr.upload.onprogress=function(e){if(e.lengthComputable){// 更新单个文件的进度(这里简化处理)}};xhr.onload=function(){if(xhr.status===200){resolve(JSON.parse(xhr.responseText));}else{reject(newError('上传文件片失败'));}};xhr.onerror=function(){reject(newError('网络错误'));};xhr.send(formData);});},generateFileId(file){// 生成文件唯一ID(用于断点续传)returnfile.name+'-'+file.size+'-'+file.lastModified;},formatFileSize(bytes){if(bytes===0)return'0 Bytes';constk=1024;constsizes=['Bytes','KB','MB','GB'];consti=Math.floor(Math.log(bytes)/Math.log(k));returnparseFloat((bytes/Math.pow(k,i)).toFixed(2))+' '+sizes[i];}}}

后端实现(ASP.NET WebForm)

1. 上传处理API

// UploadHandler.ashx<%@WebHandlerLanguage="C#"Class="UploadHandler"%>publicclassUploadHandler:IHttpHandler{privatestaticreadonlystringUploadFolder=@"E:\UploadedFiles\"; private static readonly string ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;publicvoidProcessRequest(HttpContextcontext){context.Response.ContentType="application/json";try{if(context.Request.HttpMethod=="POST"){if(context.Request.Path.Contains("InitUpload")){HandleInitUpload(context);}}}catch(Exceptionex){context.Response.Write(Newtonsoft.Json.JsonConvert.SerializeObject(new{success=false,message=ex.Message}));}}privatevoidHandleInitUpload(HttpContextcontext){// 读取前端发送的文件结构using(varreader=newStreamReader(context.Request.InputStream)){varjson=reader.ReadToEnd();varstructure=Newtonsoft.Json.JsonConvert.DeserializeObject(json);Directory.CreateDirectory(tempFolder);// 保存文件结构信息(实际应用中应该存入数据库)File.WriteAllText(Path.Combine(tempFolder,"structure.json"),json);context.Response.Write(Newtonsoft.Json.JsonConvert.SerializeObject(new{success=true,sessionId=sessionId,message="上传初始化成功"}));}}privatevoidHandleUploadChunk(HttpContextcontext){varfilePath=context.Request.Form["filePath"];varchunkIndex=int.Parse(context.Request.Form["chunkIndex"]);vartotalChunks=int.Parse(context.Request.Form["totalChunks"]);vartotalSize=long.Parse(context.Request.Form["totalSize"]);varfileId=context.Request.Form["fileId"];varsessionId=context.Request.Form["sessionId"];// 应该从cookie或header中获取context.Response.Write(Newtonsoft.Json.JsonConvert.SerializeObject(new{success=true,chunkIndex=chunkIndex,message="文件片上传成功"}));}publicboolIsReusable=>false;}

2. 下载处理API

// DownloadHandler.ashx<%@WebHandlerLanguage="C#"Class="DownloadHandler"%>publicclassDownloadHandler:IHttpHandler{privatestaticreadonlystringUploadFolder=@"E:\UploadedFiles\"; public void ProcessRequest(HttpContext context) { try { var filePath = context.Request.QueryString["path"];if(string.IsNullOrEmpty(filePath)){thrownewException("未指定文件路径");}// 防止目录遍历攻击filePath=Path.GetFullPath(Path.Combine(UploadFolder,filePath));if(!filePath.StartsWith(Path.GetFullPath(UploadFolder))){thrownewException("无效的文件路径");}}catch(Exceptionex){context.Response.StatusCode=500;context.Response.Write(ex.Message);}}publicboolIsReusable=>false;}

IE8兼容性处理

由于IE8不支持很多现代API,我们需要做以下兼容处理:

  1. File API兼容

    • IE8不支持FileFileReaderAPI,我们需要使用ActiveX或Flash作为后备方案
    • 但考虑到Flash已淘汰,我们可以提示用户升级浏览器或使用传统上传方式
  2. XMLHttpRequest兼容

    • IE8使用XDomainRequest进行跨域请求
    • 但我们的场景是同源,所以标准的XMLHttpRequest足够
  3. JSON兼容

    • 引入JSON2.js或JSON3.js作为polyfill
  4. Vue兼容

    • 使用Vue 2.x而不是Vue 3,因为Vue 3不支持IE8-10

修改后的前端入口(兼容IE8)

// src/main.js (兼容IE8版本)// 使用Vue 2.ximportVuefrom'vue';importVueRouterfrom'vue-router';importAppfrom'./App.vue';// 兼容性检查if(!window.console){window.console={log:function(){},error:function(){},warn:function(){}};}// 注册Vue插件Vue.use(VueRouter);// 路由配置constrouter=newVueRouter({routes:[{path:'/',component:()=>import('./components/FolderUploader.vue')}]});// 创建Vue实例newVue({el:'#app',router,render:h=>h(App)});

部署说明

  1. IIS配置

    • 确保启用ASP.NET功能
    • 增加上传文件大小限制(在Web.config中):
  2. 数据库准备

    CREATETABLEUploadedFiles(IdINTIDENTITY(1,1)PRIMARYKEY,FilePath NVARCHAR(1000)NOTNULL,SizeBIGINTNOTNULL,UploadDateDATETIMENOTNULL,SessionId NVARCHAR(36)NOTNULL,UserId NVARCHAR(128)NULL-- 如果有用户系统);CREATETABLEUploadSessions(SessionId NVARCHAR(36)PRIMARYKEY,UserId NVARCHAR(128)NULL,StartTimeDATETIMENOTNULL,LastActiveDATETIMENOTNULL,StatusNVARCHAR(50)NOTNULL,FileStructure NVARCHAR(MAX)NULL);
  3. 文件夹权限

    • 确保IIS应用池账户对E盘有读写权限

开发文档要点

  1. 系统架构

    • 前端:Vue2 + 原生JS(兼容IE8)
    • 后端:ASP.NET WebForm + SQL Server
    • 存储:服务器E盘
  2. 功能说明

    • 文件夹上传(保留结构)
    • 大文件分片上传
    • 断点续传
    • 加密传输(示例中简化处理)
    • 兼容IE8+现代浏览器
  3. 限制说明

    • IE8下无法实现真正的文件夹选择(只能提示用户压缩后上传)
    • 加密功能在IE8下需要简化处理
  4. 部署步骤

    • 配置IIS
    • 设置数据库连接字符串
    • 配置上传文件夹权限

总结

兄弟,这个项目确实有挑战性,但并非不可能完成。关键点在于:

  1. 分层处理:现代浏览器用现代方案,老旧浏览器用简化方案
  2. 渐进增强:先实现基本功能,再逐步添加高级特性
  3. 性能优化:分片上传、本地存储进度是关键

虽然预算只有100块,但我们可以:

  • 使用开源组件
  • 简化加密实现(或让服务器处理加密)
  • 重点保证核心功能

记住,咱们程序员的价值不在于代码量,而在于解决问题的能力!这个项目搞定了,你的技术水平绝对能上一个台阶,以后接单更有底气!

最后,欢迎加入我们的QQ群:374992201,一起交流技术,一起接单赚钱!群里还有红包和提成活动,说不定你的下一个项目就来自群里的兄弟呢!

设置框架

安装.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/7/28 1:34:08

【企业级报销系统深度解读】:Open-AutoGLM单据提交的7个核心要点

第一章&#xff1a;Open-AutoGLM报销系统架构概述Open-AutoGLM 是一个基于大语言模型驱动的智能报销处理系统&#xff0c;旨在通过自然语言理解与自动化流程编排&#xff0c;实现企业费用报销的端到端自动化。该系统融合了OCR识别、语义解析、规则引擎与工作流管理模块&#xf…

作者头像 李华
网站建设 2026/7/29 17:10:48

揭秘Open-AutoGLM会话超时机制:3步实现稳定可靠的对话控制

第一章&#xff1a;揭秘Open-AutoGLM会话超时机制的核心原理Open-AutoGLM 作为新一代自动化大语言模型交互框架&#xff0c;其会话管理机制在保障系统稳定性与资源利用率方面起着关键作用。其中&#xff0c;会话超时机制是防止无效连接长期占用服务资源的重要设计。该机制通过动…

作者头像 李华
网站建设 2026/7/25 21:24:39

别再盲目选型了,Open-AutoGLM与NeoLoad的3个核心差异你必须知道

第一章&#xff1a;Open-AutoGLM与NeoLoad性能测试的核心差异概述在自动化性能测试领域&#xff0c;Open-AutoGLM 与 NeoLoad 代表了两种截然不同的技术路径与架构理念。前者基于开源大语言模型驱动的智能测试生成机制&#xff0c;后者则延续传统企业级负载测试工具的设计范式&…

作者头像 李华
网站建设 2026/7/23 18:33:18

【Open-AutoGLM多模态理解突破】:揭秘下一代AI视觉语言模型核心技术

第一章&#xff1a;Open-AutoGLM 多模态理解深化Open-AutoGLM 作为新一代多模态大模型&#xff0c;致力于打通视觉与语言之间的语义鸿沟。其核心架构融合了视觉编码器与大规模语言模型&#xff08;LLM&#xff09;&#xff0c;通过跨模态对齐机制实现图像、文本乃至结构化数据的…

作者头像 李华
网站建设 2026/7/29 11:46:14

Open-AutoGLM与NeoLoad压测结果为何大相径庭(独家实测数据披露)

第一章&#xff1a;Open-AutoGLM与NeoLoad压测结果差异的背景与意义在现代高性能服务系统开发中&#xff0c;压力测试是验证系统稳定性和性能边界的关键环节。Open-AutoGLM 作为基于大语言模型驱动的自动化负载生成框架&#xff0c;能够智能模拟用户行为路径&#xff0c;动态调…

作者头像 李华
网站建设 2026/7/26 2:23:22

稀缺技术揭秘:Open-AutoGLM分布式任务断点恢复的5个关键设计原则

第一章&#xff1a;Open-AutoGLM分布式任务断点恢复的核心挑战在大规模语言模型训练中&#xff0c;Open-AutoGLM 的分布式架构面临任务中断后状态一致性与资源协调的严峻挑战。当训练任务因硬件故障、网络波动或调度策略中断时&#xff0c;如何准确恢复模型参数、优化器状态及数…

作者头像 李华