日期:2014-05-18 浏览次数:20581 次
using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using OASystem.Class;
using System.IO;
namespace OASystem
{
public class HttpUploadModule:IHttpModule
{
#region IHttpModule 成员
void IHttpModule.Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(application_BeginRequest);
context.EndRequest += new EventHandler(this.Application_EndRequest);
context.Error += new EventHandler(this.Application_Error);
}
void IHttpModule.Dispose()
{
}
#endregion
public void application_BeginRequest(Object sender, EventArgs e)
{
HttpApplication app = sender as HttpApplication;
HttpWorkerRequest request = GetWorkerRequest(app.Context);
System.Text.Encoding encoding = app.Context.Request.ContentEncoding;
int bytesRead = 0; // 已读数据大小
int read; // 当前读取的块的大小
int count = 8192; // 分块大小
byte[] buffer; // 保存所有上传的数据
string uploadId; // 唯一标志当前上传的ID
Progress progress; // 记录当前上传的进度信息
int maxFileSize = 52428800;//最大上传大小50M
if (request != null)
{
// 返回 HTTP 请求正文已被读取的部分。
byte[] tempBuff = request.GetPreloadedEntityBody(); //要上传的文件
// 如果是附件上传
if (tempBuff != null && IsUploadRequest(app.Request)) //判断是不是附件上传
{
// 当前上传的ID,用来唯一标志当前的上传
// 用此UploadID,可以通过其他页面获取当前上传的进度
if (app.Context.Request.Cookies["UploadID"] == null)
{
HttpCookie hCookie = new HttpCookie("UploadID");
hCookie.Value = Guid.NewGuid().ToString();
app.Context.Response.Cookies.Add(hCookie);
}
uploadId = app.Context.Request.Cookies["UploadID"].Value.ToString();
// 获取上传大小
//
long length = long.Parse(request.GetKnownRequestHeader(HttpWorkerRequest.HeaderContentLength));
// 开始记录当前上传状态
//
progress = new Progress(length, uploadId);
if (length <= maxFileSize)
{
//设置记录信息状态
progress.SetState(UploadState.ReceivingData);
buffer = new byte[length];
count = tempBuff.Length; // 分块大小
// 将已上传数据复制过去
//
Buffer.BlockCopy(tempBuff, //源数据
0, //从0开始读
buffer, //目标容器
bytesRead, //指定存储的开始位置
count); //要复制的字节数。
// 开始记录已上传大小
bytesRead = tempBuff.Length;
progress.SetBytesRead(bytesRead);
SetProgress(uploadId, progress, app.Application);
// 循环分块读取,直到所有数据读取结束
while (request.IsClientConnected() && !request.IsEntireEntityBodyIsPreloaded() && bytesRead < length)
{
// 如果最后一块大小小于分块大小,则重新分块
if (bytesRead + count > length)