Go ahead

  -  Somethings you can't control,just go ahead

Asp.net Study(16)

栏目:06.杂烩      124 views      尚无回复

文件上传

利用HtmlInputFile控件进行文件上传

用到的属性:PostedFile

HttpPostedFile是System.Web命名空间中的一个类,它的属性和方法包括:ContentLength,ContentType,FileName,InputStream,SaveAs

1,首先通过HtmlInputFile控件的PostedFile属性建立HttpPostedFile实例
2,通过HttpPostedFile的FileName属性取得文件名
3,通过HttpPostedFile的SaveAs方法进行保存
同时可以通过ContentLength,ContentType属性取得文件长度和文件类型。

代码(用code-behind进行代码分离):

说明:亲密接触Asp.net教材中提到,使用Code-behind进行代码分离时要在.cs文件中对主文件中的Html控件进行声明。但实践发现,使用vs2005创建web form后vs会自动进行主文件和后台.cs文件的关联,不需要特别声明。

DoUpload.aspx代码:

<%@ Page Language=”C#” AutoEventWireup=”true” CodeFile=”DoUpLoad.aspx.cs” Inherits=”DoUpLoad” %>

<!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″ enctype=”multipart/form-data” runat=”server”>
<div>
Please choose the file that you want to upload:<Input type=file id=”UpLoadFile” runat=server><br>
<Input type=submit value=”UpLoad” onserverclick=”UpLoad” runat=server>
<hr>
Uploaded filename:<asp:Label ID=”FileName” Text=”UnUpload” runat=server/><br>
File size:<asp:Label ID=”FileSize” Text=”UnUpload” runat=server/><br>
Real Filename:<asp:Label ID=”rFileName” Text=”UnUpload” runat=server/><br>
File Type:<asp:Label ID=”FileType” Text=”UnUpload” runat=server/><br>
Content of InputStream:<asp:Label ID=”InputStream” Text=”UnUpload” runat=server/>
</div>
</form>
</body>
</html>

DoUpload.aspx.cs代码:

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;

public partial class DoUpLoad : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
UpLoadFile.MaxLength = 5300493;
UpLoadFile.Size = 20;
}

public void UpLoad(object sender, EventArgs e)
{
HttpPostedFile hpf = UpLoadFile.PostedFile;
FileName.Text = hpf.FileName;
FileSize.Text = hpf.ContentLength.ToString();
FileType.Text = hpf.ContentType.ToString();
InputStream.Text = hpf.InputStream.ToString();

char[] de ={ ‘\\’ };
string[] AFileName = hpf.FileName.Split(de);
string strFileName = AFileName[AFileName.Length – 1];
rFileName.Text = strFileName;

hpf.SaveAs(Server.MapPath(“.”) + “\\UpLoadFile\\” + strFileName);
}
}


问题点:在测试的时候发现,大文件上传时会出错。google了一下思归提供了解决办法,但作为一个初学者,没有完整的代码,看不大懂。

下边是在itepub.net里有完整代码的解决办法,原文地址:http://www.itepub.net/html/kaifajingcui/Asp_Net/2006/0828/41240.html
在这里保存一下,以后查阅起来方便点。

利用隐含的HttpWorkerRequest用它的GetPreloadedEntityBody ReadEntityBody方法处理文件流

HttpApplication application1 = sender as HttpApplication;
HttpWorkerRequest request1 = (HttpWorkerRequest) ((IServiceProvider) HttpContext.Current).GetService(typeof(HttpWorkerRequest));
try
{
if (application1.Context.Request.ContentType.IndexOf(“multipart/form-data”) <= -1)
{
return;
}
//Check The HasEntityBody
if (!request1.HasEntityBody())
{
return;
}
int num1 = 0;
TimeSpan span1 = DateTime.Now.Subtract(this.beginTime);

string text1 = application1.Context.Request.ContentType.ToLower();

byte[] buffer1 = Encoding.ASCII.GetBytes((“\r\n–” + text1.Substring(text1.IndexOf(“boundary=”) + 9)).ToCharArray());
int num2 = Convert.ToInt32(request1.GetKnownRequestHeader(11));
Progress progress1 = new Progress();

application1.Context.Items.Add(“FileList”, new Hashtable());

byte[] buffer2 = request1.GetPreloadedEntityBody();
num1 += buffer2.Length;

string text2 = this.AnalysePreloadedEntityBody(buffer2, “UploadGUID”);
if (text2 != string.Empty)
{
application1.Context.Items.Add(“LionSky_UpLoadModule_UploadGUID”, text2);
}
bool flag1 = true;
if ((num2 > this.UpLoadFileLength()) && ((0 > span1.TotalHours) || (span1.TotalHours > 3)))
{
flag1 = false;
}
if ((0 > span1.TotalHours) || (span1.TotalHours > 3))
{
flag1 = false;
}
string text3 = this.AnalysePreloadedEntityBody(buffer2, “UploadFolder”);
ArrayList list1 = new ArrayList();
RequestStream stream1 = new RequestStream(buffer2, buffer1, null, RequestStream.FileStatus.Close, RequestStream.ReadStatus.NoRead, text3, flag1, application1.Context, string.Empty);
list1.AddRange(stream1.ReadBody);
if (text2 != string.Empty)
{
progress1.FileLength = num2;
progress1.ReceivedLength = num1;
progress1.FileName = stream1.OriginalFileName;
progress1.FileCount = ((Hashtable) application1.Context.Items[“FileList”]).Count;
application1.Application[“_UploadGUID_” + text2] = progress1;
}

if (!request1.IsEntireEntityBodyIsPreloaded())
{
byte[] buffer4;
ArrayList list2;
int num3 = 204800;
byte[] buffer3 = new byte[num3];
while ((num2 – num1) >= num3)
{
if (!application1.Context.Response.IsClientConnected)
{
this.ClearApplication(application1);
}
num3 = request1.ReadEntityBody(buffer3, buffer3.Length);
num1 += num3;
list2 = stream1.ContentBody;
if (list2.Count > 0)
{
buffer4 = new byte[list2.Count + buffer3.Length];
list2.CopyTo(buffer4, 0);
buffer3.CopyTo(buffer4, list2.Count);
stream1 = new RequestStream(buffer4, buffer1, stream1.FileStream, stream1.FStatus, stream1.RStatus, text3, flag1, application1.Context, stream1.OriginalFileName);
}
else
{
stream1 = new RequestStream(buffer3, buffer1, stream1.FileStream, stream1.FStatus, stream1.RStatus, text3, flag1, application1.Context, stream1.OriginalFileName);
}
list1.AddRange(stream1.ReadBody);
if (text2 != string.Empty)
{
progress1.ReceivedLength = num1;
progress1.FileName = stream1.OriginalFileName;
progress1.FileCount = ((Hashtable) application1.Context.Items[“FileList”]).Count;
application1.Application[“_UploadGUID_” + text2] = progress1;
}
}
buffer3 = new byte[num2 – num1];
if (!application1.Context.Response.IsClientConnected && (stream1.FStatus == RequestStream.FileStatus.Open))
{
this.ClearApplication(application1);
}
num3 = request1.ReadEntityBody(buffer3, buffer3.Length);
list2 = stream1.ContentBody;
if (list2.Count > 0)
{
buffer4 = new byte[list2.Count + buffer3.Length];
list2.CopyTo(buffer4, 0);
buffer3.CopyTo(buffer4, list2.Count);
stream1 = new RequestStream(buffer4, buffer1, stream1.FileStream, stream1.FStatus, stream1.RStatus, text3, flag1, application1.Context, stream1.OriginalFileName);
}
else
{
stream1 = new RequestStream(buffer3, buffer1, stream1.FileStream, stream1.FStatus, stream1.RStatus, text3, flag1, application1.Context, stream1.OriginalFileName);
}
list1.AddRange(stream1.ReadBody);
if (text2 != string.Empty)
{
progress1.ReceivedLength = num1 + buffer3.Length;
progress1.FileName = stream1.OriginalFileName;
progress1.FileCount = ((Hashtable) application1.Context.Items[“FileList”]).Count;
if (flag1)
{
progress1.UploadStatus = Progress.UploadStatusEnum.Uploaded;
}
else
{
application1.Application.Remove(“_UploadGUID_” + text2);
}
}
}
byte[] buffer5 = new byte[list1.Count];
list1.CopyTo(buffer5);
this.PopulateRequestData(request1, buffer5);
}
catch (Exception exception1)
{
this.ClearApplication(application1);
throw exception1;
}




发表回复


XHTML: 您可以使用如下代码:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>