asp.net 大文件上传 之 改版了的SlickUpload.HttpUploadModule(Krystalware.SlickUpload.dll)

/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, 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);

  }

  }

  }