大文件上传案例:
http://www.51nfs.com 联系:QQ19526354
前台:
<%@ Page Language=
"C#" AutoEventWireup=
"true" CodeFile=
"Default.aspx.cs"
Inherits=
"HttpModelApp._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns= "http://www.w3.org/1999/xhtml" >
<head runat= "server">
<title>无标题页</title>
</head>
<body>
<form id= "form1" runat= "server" encType= "multipart/form-data" method= "post">
<div>
<INPUT id= "firstFile" type= "file" name= "firstFile" runat= "server"><br />
<asp:Button ID= "Button1" runat= "server" OnClick= "Button1_Click" Text= "上传" /><br />
<asp:Label ID= "Label1" runat= "server"></asp:Label></div>
</form>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns= "http://www.w3.org/1999/xhtml" >
<head runat= "server">
<title>无标题页</title>
</head>
<body>
<form id= "form1" runat= "server" encType= "multipart/form-data" method= "post">
<div>
<INPUT id= "firstFile" type= "file" name= "firstFile" runat= "server"><br />
<asp:Button ID= "Button1" runat= "server" OnClick= "Button1_Click" Text= "上传" /><br />
<asp:Label ID= "Label1" runat= "server"></asp:Label></div>
</form>
</body>
</html>
后台:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using HttpModelApp;
namespace HttpModelApp
{
public partial class _Default : System.Web.UI.Page
{
void Page_Load() void Page_Load(object sender, EventArgs e)
{
}
void Button1_Click() void Button1_Click(object sender, EventArgs e)
{
//要保存的位置
string strDesPath = "D:\\";
string strFileName = this.firstFile.PostedFile.FileName;
strFileName = strDesPath + strFileName.Substring(strFileName.LastIndexOf("\\"));
float i = this.firstFile.PostedFile.ContentLength;
this.firstFile.PostedFile.SaveAs(strFileName);
this.Label1.Text = "文件保存到了:" + strFileName + "大小"+ i/1024000 + "m";
}
}
}
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using HttpModelApp;
namespace HttpModelApp
{
public partial class _Default : System.Web.UI.Page
{
void Page_Load() void Page_Load(object sender, EventArgs e)
{
}
void Button1_Click() void Button1_Click(object sender, EventArgs e)
{
//要保存的位置
string strDesPath = "D:\\";
string strFileName = this.firstFile.PostedFile.FileName;
strFileName = strDesPath + strFileName.Substring(strFileName.LastIndexOf("\\"));
float i = this.firstFile.PostedFile.ContentLength;
this.firstFile.PostedFile.SaveAs(strFileName);
this.Label1.Text = "文件保存到了:" + strFileName + "大小"+ i/1024000 + "m";
}
}
}
配置:
<?xml version=
"1.0" encoding=
"utf-8"?>
<configuration>
<appSettings/>
<connectionStrings/>
<system.web>
<!--
设置 compilation debug= "true" 将调试符号插入
已编译的页面中。但由于这会
影响性能,因此只在开发过程中将此值
设置为 true。
-->
<compilation debug= "true" />
<!--
通过 <authentication> 节可以配置 ASP.NET 使用的
安全身份验证模式,
以标识传入的用户。
-->
<authentication mode= "Windows" />
<!--
如果在执行请求的过程中出现未处理的错误,
则通过 <customErrors> 节可以配置相应的处理步骤。具体说来,
开发人员通过该节可以配置
要显示的 html 错误页
以代替错误堆栈跟踪。
<customErrors mode= "RemoteOnly" defaultRedirect= "GenericErrorPage.htm">
< error statusCode= "403" redirect= "NoAccess.htm" />
< error statusCode= "404" redirect= "FileNotFound.htm" />
</customErrors>
-->
<httpModules>
<add name= "HttpUploadModule"
type= "HttpModelApp.HttpUploadModule, HttpModelApp" />
</httpModules>
<httpRuntime maxRequestLength= "2000000" executionTimeout= "300" />
</system.web>
</configuration>
<configuration>
<appSettings/>
<connectionStrings/>
<system.web>
<!--
设置 compilation debug= "true" 将调试符号插入
已编译的页面中。但由于这会
影响性能,因此只在开发过程中将此值
设置为 true。
-->
<compilation debug= "true" />
<!--
通过 <authentication> 节可以配置 ASP.NET 使用的
安全身份验证模式,
以标识传入的用户。
-->
<authentication mode= "Windows" />
<!--
如果在执行请求的过程中出现未处理的错误,
则通过 <customErrors> 节可以配置相应的处理步骤。具体说来,
开发人员通过该节可以配置
要显示的 html 错误页
以代替错误堆栈跟踪。
<customErrors mode= "RemoteOnly" defaultRedirect= "GenericErrorPage.htm">
< error statusCode= "403" redirect= "NoAccess.htm" />
< error statusCode= "404" redirect= "FileNotFound.htm" />
</customErrors>
-->
<httpModules>
<add name= "HttpUploadModule"
type= "HttpModelApp.HttpUploadModule, HttpModelApp" />
</httpModules>
<httpRuntime maxRequestLength= "2000000" executionTimeout= "300" />
</system.web>
</configuration>
类:
using System;
using System.Collections;
using System.Collections.Specialized;
using System.Globalization;
using System.IO;
using System.Text;
using System.Web;
using System.Reflection;
namespace HttpModelApp
{
//实现IHttpModule接口
public class HttpUploadModule : IHttpModule
{
HttpUploadModule() HttpUploadModule()
{
}
void Init() void Init(HttpApplication application)
{
//订阅事件
application.BeginRequest += new EventHandler(this.Application_BeginRequest);
}
void Dispose() void Dispose()
{
}
void Application_BeginRequest() void Application_BeginRequest(Object sender, EventArgs e)
{
HttpApplication app = sender as HttpApplication;
HttpWorkerRequest request = GetWorkerRequest(app.Context);
Encoding encoding = app.Context.Request.ContentEncoding;
int bytesRead = 0; // 已读数据大小
int read; // 当前读取的块的大小
int count = 8192; // 分块大小
byte[] buffer; // 保存所有上传的数据
if (request != null)
{
// 返回 HTTP 请求正文已被读取的部分。
byte[] tempBuff = request.GetPreloadedEntityBody(); //要上传的文件
// 如果是附件上传
if (tempBuff != null && IsUploadRequest(app.Request)) //判断是不是附件上传
{
// 获取上传大小
//
long length = long.Parse(request.GetKnownRequestHeader(HttpWorkerRequest.HeaderContentLength));
buffer = new byte[length];
count = tempBuff.Length; // 分块大小
// 将已上传数据复制过去
//
Buffer.BlockCopy(tempBuff, //源数据
0, //从0开始读
buffer, //目标容器
bytesRead, //指定存储的开始位置
count); //要复制的字节数。
// 开始记录已上传大小
bytesRead = tempBuff.Length;
// 循环分块读取,直到所有数据读取结束
while (request.IsClientConnected() &&!request.IsEntireEntityBodyIsPreloaded() && bytesRead < length)
{
// 如果最后一块大小小于分块大小,则重新分块
if (bytesRead + count > length)
{
count = (int)(length - bytesRead);
tempBuff = new byte[count];
}
// 分块读取
read = request.ReadEntityBody(tempBuff, count);
// 复制已读数据块
Buffer.BlockCopy(tempBuff, 0, buffer, bytesRead, read);
// 记录已上传大小
bytesRead += read;
}
if ( request.IsClientConnected() && !request.IsEntireEntityBodyIsPreloaded() )
{
// 传入已上传完的数据
InjectTextParts(request, buffer);
}
}
}
}
HttpWorkerRequest GetWorkerRequest(HttpContext context)
{
IServiceProvider provider = (IServiceProvider)HttpContext.Current;
return (HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest));
}
/// <summary>
/// 传入已上传完的数据
/// </summary>
/// <param name= "request"></param>
/// <param name= "textParts"></param>
void InjectTextParts(HttpWorkerRequest request, byte[] textParts)
{
BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic;
Type type = request.GetType();
while ((type != null) && (type.FullName != "System.Web.Hosting.ISAPIWorkerRequest"))
{
type = type.BaseType;
}
if (type != null)
{
type.GetField( "_contentAvailLength", bindingFlags).SetValue(request, textParts.Length);
type.GetField( "_contentTotalLength", bindingFlags).SetValue(request, textParts.Length);
type.GetField( "_preloadedContent", bindingFlags).SetValue(request, textParts);
type.GetField( "_preloadedContentRead", bindingFlags).SetValue(request, true);
}
}
static bool StringStartsWithAnotherIgnoreCase() static bool StringStartsWithAnotherIgnoreCase( string s1, string s2)
{
return ( string.Compare(s1, 0, s2, 0, s2.Length, true, CultureInfo.InvariantCulture) == 0);
}
/// <summary>
/// 是否为附件上传
/// 判断的根据是ContentType中有无multipart/form-data
/// </summary>
/// <param name= "request"></param>
/// <returns></returns>
bool IsUploadRequest(HttpRequest request)
{
return StringStartsWithAnotherIgnoreCase(request.ContentType, "multipart/form-data");
}
}
}
using System.Collections;
using System.Collections.Specialized;
using System.Globalization;
using System.IO;
using System.Text;
using System.Web;
using System.Reflection;
namespace HttpModelApp
{
//实现IHttpModule接口
public class HttpUploadModule : IHttpModule
{
HttpUploadModule() HttpUploadModule()
{
}
void Init() void Init(HttpApplication application)
{
//订阅事件
application.BeginRequest += new EventHandler(this.Application_BeginRequest);
}
void Dispose() void Dispose()
{
}
void Application_BeginRequest() void Application_BeginRequest(Object sender, EventArgs e)
{
HttpApplication app = sender as HttpApplication;
HttpWorkerRequest request = GetWorkerRequest(app.Context);
Encoding encoding = app.Context.Request.ContentEncoding;
int bytesRead = 0; // 已读数据大小
int read; // 当前读取的块的大小
int count = 8192; // 分块大小
byte[] buffer; // 保存所有上传的数据
if (request != null)
{
// 返回 HTTP 请求正文已被读取的部分。
byte[] tempBuff = request.GetPreloadedEntityBody(); //要上传的文件
// 如果是附件上传
if (tempBuff != null && IsUploadRequest(app.Request)) //判断是不是附件上传
{
// 获取上传大小
//
long length = long.Parse(request.GetKnownRequestHeader(HttpWorkerRequest.HeaderContentLength));
buffer = new byte[length];
count = tempBuff.Length; // 分块大小
// 将已上传数据复制过去
//
Buffer.BlockCopy(tempBuff, //源数据
0, //从0开始读
buffer, //目标容器
bytesRead, //指定存储的开始位置
count); //要复制的字节数。
// 开始记录已上传大小
bytesRead = tempBuff.Length;
// 循环分块读取,直到所有数据读取结束
while (request.IsClientConnected() &&!request.IsEntireEntityBodyIsPreloaded() && bytesRead < length)
{
// 如果最后一块大小小于分块大小,则重新分块
if (bytesRead + count > length)
{
count = (int)(length - bytesRead);
tempBuff = new byte[count];
}
// 分块读取
read = request.ReadEntityBody(tempBuff, count);
// 复制已读数据块
Buffer.BlockCopy(tempBuff, 0, buffer, bytesRead, read);
// 记录已上传大小
bytesRead += read;
}
if ( request.IsClientConnected() && !request.IsEntireEntityBodyIsPreloaded() )
{
// 传入已上传完的数据
InjectTextParts(request, buffer);
}
}
}
}
HttpWorkerRequest GetWorkerRequest(HttpContext context)
{
IServiceProvider provider = (IServiceProvider)HttpContext.Current;
return (HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest));
}
/// <summary>
/// 传入已上传完的数据
/// </summary>
/// <param name= "request"></param>
/// <param name= "textParts"></param>
void InjectTextParts(HttpWorkerRequest request, byte[] textParts)
{
BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic;
Type type = request.GetType();
while ((type != null) && (type.FullName != "System.Web.Hosting.ISAPIWorkerRequest"))
{
type = type.BaseType;
}
if (type != null)
{
type.GetField( "_contentAvailLength", bindingFlags).SetValue(request, textParts.Length);
type.GetField( "_contentTotalLength", bindingFlags).SetValue(request, textParts.Length);
type.GetField( "_preloadedContent", bindingFlags).SetValue(request, textParts);
type.GetField( "_preloadedContentRead", bindingFlags).SetValue(request, true);
}
}
static bool StringStartsWithAnotherIgnoreCase() static bool StringStartsWithAnotherIgnoreCase( string s1, string s2)
{
return ( string.Compare(s1, 0, s2, 0, s2.Length, true, CultureInfo.InvariantCulture) == 0);
}
/// <summary>
/// 是否为附件上传
/// 判断的根据是ContentType中有无multipart/form-data
/// </summary>
/// <param name= "request"></param>
/// <returns></returns>
bool IsUploadRequest(HttpRequest request)
{
return StringStartsWithAnotherIgnoreCase(request.ContentType, "multipart/form-data");
}
}
}
转载于:https://blog.51cto.com/maowen/161808