asp.net 大文件上传 之 改版了的SlickUpload.HttpUploadModule(
发布时间:2020-12-15 20:44:57 所属栏目:asp.Net 来源:网络整理
导读:/200905/yuanma/SlickUpload.rar /200905/yuanma/Krystalware.SlickUpload.rar 复制代码 代码如下: using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.Se
/200905/yuanma/SlickUpload.rar /200905/yuanma/Krystalware.SlickUpload.rar 复制代码 代码如下: using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using System.IO; using System.Text; using System.Reflection; namespace Krystalware.SlickUpload { /** * [[服务器端WebConfig.XML设置]] * * 需要在WebConfig.XML中进配置,以下结于 *<configuration> <appSettings> <add key="HttpUploadModulePageGoOn" value="*.*;"/> <add key="HttpUploadModulePageJump" value="x.aspx;"/> </appSettings> *<system.web> <httpModules> <add name="HttpUploadModule" type="SlickUpload.HttpUploadModule,SlickUpload" /> </httpModules> <httpRuntime maxRequestLength="1000000" /> *</system.web> *</configuration> * [说明] 1、如果满足<HttpUploadModulePageJump>所设置的页面,则不使用大文件上传功能,直接跳出 /// 当没有设置[HttpUploadModulePageJump]则返回false; /// 当设置[HttpUploadModulePageJump]中有[*.*;]时则返回true /// 当设置[HttpUploadModulePageJump]中的页面等同与所要处理页面的后缀时,则返回true,否则返回false 2、如果不满足<HttpUploadModulePageJump>所设置的页面则继续进行下一判断. 3、如果满足<HttpUploadModulePageGoOn>所设置的页面,则使用大文件上传功能;否则跳出 /// 当没有设置[HttpUploadModulePageGoOn]则返回false; /// 当设置[HttpUploadModulePageGoOn]中有[*.*;]时则返回true /// 当设置[HttpUploadModulePageGoOn]中的页面等同与所要处理页面的后缀时,则返回true,否则返回false * * **/ public sealed class HttpUploadModule : IHttpModule { public HttpUploadModule() { } private void CleanupFiles(HttpContext context) { MimeUploadHandler handler1 = this.GetUploadHandler(context); if (handler1 != null) { foreach (UploadedFile file1 in handler1.UploadedFiles) { File.Delete(file1.ServerPath); } handler1.UploadedFiles.Clear(); } } private void ClearUploadStatus() { HttpUploadModule.RemoveFrom(HttpContext.Current.Application,HttpUploadModule.GetUploadStatus().UploadId); } private void context_BeginRequest(object sender,EventArgs e) { HttpApplication application1 = sender as HttpApplication; //begin: jiang zhi 2005.10.15+ //如果满足<HttpUploadModulePageJump>所设置的页面,则不使用大文件上传功能,直接跳出 if (IsJump(application1)) return; //如果满足<HttpUploadModulePageGoOn>所设置的页面,则使用大文件上传功能; //如果不满足<HttpUploadModulePageGoOn>所设置的页面,则不使用大文件上传功能;直接跳出 if (!IsGoOn(application1)) return; //end if (this.IsUploadRequest(application1.Request)) { HttpWorkerRequest request1 = this.GetWorkerRequest(application1.Context); Encoding encoding1 = application1.Context.Request.ContentEncoding; if (request1 != null) { byte[] buffer1 = this.ExtractBoundary(application1.Request.ContentType,encoding1); string text1 = application1.Request.QueryString["uploadId"]; MimeUploadHandler handler1 = new MimeUploadHandler(new RequestStream(request1),buffer1,text1,encoding1); if (text1 != null) { this.RegisterIn(application1.Context,handler1); } try { this.SetUploadState(application1.Context,UploadState.ReceivingData); handler1.Parse(); this.InjectTextParts(request1,encoding1.GetBytes(handler1.TextParts)); } catch (DisconnectedException) { this.CleanupFiles(application1.Context); } } } } /// <summary> /// 当没有设置[HttpUploadModulePageJump]则返回false; /// 当设置[HttpUploadModulePageJump]中有[*.*;]时则返回true /// 当设置[HttpUploadModulePageJump]中的页面等同与所要处理页面的后缀时,则返回true,否则返回false /// </summary> /// <param name="application1"></param> /// <returns></returns> private bool IsJump(HttpApplication application1) { bool result = false; if (application1.Application["HttpUploadModulePageJump"] != null) { string[] al = ((string)application1.Application["HttpUploadModulePageJump"]).Split(';'); if (al != null ) { for(int i = 0; i < al.Length; i++) { string temp= al[i];//"OfficeServer.aspx"; if (temp =="*.*") { result = true; break; } if (application1.Request.Path.EndsWith(temp)) { result = true; break; } } } } return result; } /// <summary> /// 当没有设置[HttpUploadModulePageGoOn]则返回false; /// 当设置[HttpUploadModulePageGoOn]中有[*.*;]时则返回true /// 当设置[HttpUploadModulePageGoOn]中的页面等同与所要处理页面的后缀时,则返回true,否则返回false /// </summary> /// <param name="application1"></param> /// <returns></returns> private bool IsGoOn(HttpApplication application1) { bool result = false; if (application1.Application["HttpUploadModulePageGoOn"] != null) { string[] al = ((string)application1.Application["HttpUploadModulePageGoOn"]).Split(';'); if (al != null) { for(int i = 0; i < al.Length; i++) { string temp= al[i];//"OfficeServer.aspx"; if (temp =="*.*") { result = true; break; } if (application1.Request.Path.EndsWith(temp)) { result = true; break; } } } } return result; } private void context_EndRequest(object sender,EventArgs e) { HttpApplication application1 = sender as HttpApplication; //begin: 2005.10.15+ //如果满足<HttpUploadModulePageJump>所设置的页面,则不使用大文件上传功能,直接跳出 if (IsJump(application1)) return; //如果满足<HttpUploadModulePageGoOn>所设置的页面,则使用大文件上传功能; //如果不满足<HttpUploadModulePageGoOn>所设置的页面,则不使用大文件上传功能;直接跳出 if (!IsGoOn(application1)) return; //end if (this.IsUploadRequest(application1.Request)) { this.SetUploadState(application1.Context,UploadState.Complete); this.CleanupFiles(application1.Context); } string text1 = (string) application1.Context.Items["__removeUploadStatus"]; if ((text1 != null) && (text1.Length > 0)) { HttpUploadModule.RemoveFrom(application1.Application,text1); } } private void context_Error(object sender,UploadState.Error); this.CleanupFiles(application1.Context); } } private byte[] ExtractBoundary(string contentType,Encoding encoding) { int num1 = contentType.IndexOf("boundary="); if (num1 > 0) { return encoding.GetBytes("--" + contentType.Substring(num1 + 9)); } return null; } public static UploadedFileCollection GetUploadedFiles() { return HttpUploadModule.GetUploadedFiles(HttpContext.Current); } public static UploadedFileCollection GetUploadedFiles(HttpContext context) { MimeUploadHandler handler1 = (MimeUploadHandler) context.Items["_uploadHandler"]; if (handler1 != null) { return UploadedFileCollection.ReadOnly(handler1.UploadedFiles); } return null; } private MimeUploadHandler GetUploadHandler(HttpContext context) { return (MimeUploadHandler) context.Items["_uploadHandler"]; } public static UploadStatus GetUploadStatus() { return HttpUploadModule.GetUploadStatus(HttpContext.Current); } public static UploadStatus GetUploadStatus(HttpApplicationState application,string uploadId) { return (UploadStatus) application["_UploadStatus_" + uploadId]; } public static UploadStatus GetUploadStatus(HttpContext context) { return HttpUploadModule.GetUploadStatus(context.Request.QueryString["uploadId"]); } public static UploadStatus GetUploadStatus(string uploadId) { HttpContext context1 = HttpContext.Current; UploadStatus status1 = HttpUploadModule.GetUploadStatus(context1.Application,uploadId); if (((status1 != null) && (status1.State != UploadState.ReceivingData)) && status1.AutoDropState) { context1.Items["__removeUploadStatus"] = uploadId; } return status1; } private HttpWorkerRequest GetWorkerRequest(HttpContext context) { return (HttpWorkerRequest) ((IServiceProvider) HttpContext.Current).GetService(typeof(HttpWorkerRequest)); } private void InjectTextParts(HttpWorkerRequest request,byte[] textParts) { BindingFlags flags1 = BindingFlags.NonPublic | BindingFlags.Instance; Type type1 = request.GetType(); while ((type1 != null) && (type1.FullName != "System.Web.Hosting.ISAPIWorkerRequest")) { type1 = type1.BaseType; } if (type1 != null) { type1.GetField("_contentAvailLength",flags1).SetValue(request,textParts.Length); type1.GetField("_contentTotalLength",textParts.Length); type1.GetField("_preloadedContent",textParts); type1.GetField("_preloadedContentRead",true); } } private bool IsUploadRequest(HttpRequest request) { return request.ContentType.ToLower().StartsWith("multipart/form-data"); } private void RegisterIn(HttpContext context,MimeUploadHandler handler) { context.Items["_uploadHandler"] = handler; context.Application["_UploadStatus_" + handler.UploadStatus.UploadId] = handler.UploadStatus; } public static void RemoveFrom(HttpApplicationState application,string uploadId) { application.Remove("_UploadStatus_" + uploadId); } public static void RemoveFrom(string uploadId) { HttpUploadModule.RemoveFrom(HttpContext.Current.Application,uploadId); } private void SetUploadState(HttpContext context,UploadState state) { MimeUploadHandler handler1 = this.GetUploadHandler(context); if (handler1 != null) { handler1.UploadStatus.SetState(state); } } void IHttpModule.Dispose() { } void IHttpModule.Init(HttpApplication context) { context.BeginRequest += new EventHandler(this.context_BeginRequest); context.Error += new EventHandler(this.context_Error); context.EndRequest += new EventHandler(this.context_EndRequest); } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net – jqgrid jsonReader配置
- asp.net-mvc – AngularJS $http.put不能与ASP.NET MVC控制
- asp.net – 如何在成功插入数据后清除radiobutton列表?
- asp.net-mvc – MVC3 Razor视图中的文本文字问题
- 在ASP.NET C中将byte []流式传输到Image
- asp.net-membership – 覆盖ASP.NET MVC 4中的ASP.NET成员资
- ASP.NET WebApi OAuth2身份认证,搭建客户端(二)
- asp.net – 无法加载文件或程序集“System.Web.Mvc,Version
- asp.net-mvc-2 – 什么是MapRoute名称空间参数?
- asp.net-mvc – 什么是Owin rememberBrowser做什么?
推荐文章
站长推荐
- asp.net-mvc – 将匿名对象从视图传递到部分视图
- asp.net-mvc-4 – 获取上下文是不可构建的.添加一
- asp.net – 连接到MySQL导致错误“未找到数据源名
- asp.net-mvc – ASP.NET MVC:Action中的授权 –
- asp.net-mvc-3 – .Net Mvc 3触发器(提交按钮除外
- asp.net – 网站和虚拟目录之间有什么区别
- asp.net jquery+ajax异步刷新实现示例
- asp.net-mvc – 如何在EditorTemplate中获取完全
- 通过ASP.NET运行时将IIS7配置为服务器静态内容
- 经典的asp和ASP.NET MVC可以在同一个站点上并行运
热点阅读