/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 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></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></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, 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.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", flags1).SetValue(request, textParts.Length); type1.GetField("_preloadedContent", flags1).SetValue(request, textParts); type1.GetField("_preloadedContentRead", flags1).SetValue(request, 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); } } }
(编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|