asp.net|上传
在ASP里要上传一个文件是很麻烦的事,需要稻香老农之类的组件的支持。在ASP.Net事情就变得简单了许多。
如下面上传图片的例子。
首先申明使用命名空间。using System.IO;
在设计页面拖进一个input(File)控件,并把它作为服务器控件运行。其ID为myFile;然后拖进一个button,给button的单击时间添加如下代码:
protected void submit_Click(object sender, EventArgs e)
{
string phName = this.txtName.Text;
string phType = this.ddlType.SelectedValue;
if (this.myFile.PostedFile != null)
{
string photoName1 = myFile.PostedFile.FileName; //获取初始文件名
int i = photoName1.LastIndexOf("."); //取得文件名中最后一个"."的索引
string newext = photoName1.Substring(i); //获取文件扩展名
if (newext != ".gif" && newext != ".jpg"&&newext!=".jpeg" && newext != ".bmp" && newext != ".png")
{
Response.Write("文件格式不正确!");
Response.End();
}
DateTime now = DateTime.Now; //获取系统时间
string photoName2 = now.Millisecond.ToString() + "_" + myFile.PostedFile.ContentLength.ToString() + newext; //重新为文件命名,时间毫秒部分+文件大小+扩展名
myFile.PostedFile.SaveAs(Server.MapPath("photos" + photoName2)); // 保存文件到路径,用Server.MapPath()取当前文件的绝对目录.在asp.net里"\"必须用""代替
}
}
HtmlInputFile对象与HTML文件输入元素对应。你可用由id属性指定的名称来访问它。它有下列特性:
* PostedFile:上传文件的内容。
* Accept:以逗号界定的MIME类型列表,指定可能提交的文件类型。
* MaxLength:要提交的文件的最长文件名长度(包括路径)。
* Size:用户输入/选择上传文件的文本框宽度。
以下是HTML输入控制的方法与特性:
* FileName:用户计算机上的完全合格的文件名称。它还包含上传文件的本地路径。
* ContentLength:上传文件的大小(字节)。
* ContentType:上传文件的MIME内容类型。
* InputStream:返回一个指向上传文件的流(Stream)对象,允许你阅读文件内容。
* SaveAs:方便保存上传文件的内容。
==================相关文章===================
利用ASP.NET向服务器上传文件
文件上传技术是一个很实用的技术,有着很广泛的应用,在ASP.NET自身的前一个版本ASP里实现这个功能,就必须使用第三方的组件或者自己开发组件了,现在,用ASP.NET实现起来就简单得多了,我们不需要使用任何组件就可以实现上传的功能了。
为了方便讲解,我们可以把文件上传分成两种类型:单一文件上传和多文件上传。
单一文件上传
我们先来介绍单一文件上传的方法,单一文件上传就比较简单了,
下面是实现单一文件上传的完整代码:
<% Import Namespace="System" %>
<% Import Namespace="System.Web.HttpPostedFile" %>
<% Import Namespace="System.Web.UI.HtmlControls.HtmlInputFile" %>
<script language="VB" runat="server">
Sub UpLoad(Src As Object, E As EventArgs)
If UploadFile.PostedFile.ContentLength=0 then
ShowUpLoadFile.innerText="上传失败或文件不存在!"
Else
'获取文件名
dim Temp() as String=Split(UploadFile.PostedFile.FileName,"\")
dim FileName as String=Temp(Temp.Length-1)
'保存文件
UploadFile.PostedFile.SaveAs(Server.MapPath(".") & "\Files\" & FileName)
'显示上传结果
ShowUpLoadFile.InnerHtml="文件上传成功!
上传文件名:" & FileName
End If
End Sub
</script>
<html>
<body>
<form runat="server" enctype="multipart/form-data">
<input type="file" id="UploadFile" runat="server" size="50">
<asp:button runat="server" Text="立即上传" />
</form>
<hr>
<span id="ShowUpLoadFile" runat="server"></span>
</body>
</html>
把上面的代码保存成.aspx文件,然后在该文件所在目录下创建一个存放文件的新目录Files,运行,先感受一下效果,然后再继续看下面的讲解
使用ASP.NET上传文件,需要用到.NET框架的两个类:HttpPostedFile和HtmlInputFile,这两个类所在的命名空间分别是 System.Web.HttpPostedFile和System.Web.UI.HtmlControls.HtmlInputFile,所以我们要在文件开头先导入这两个命名空间,
其中的PostedFile表示上传到服务器的文件,它包含几个常用的属性:
ContentLength:文件大小;
FileName:上传文件的详细路径及文件名;
ContentType :上传文件的文件类型。
字符分割函数Split是用来取得文件名的,因为通过PostedFile.FileName获得的是详细的路径及文件名。
多文件上传
所谓的多文件上传就是同时上传多个文件,这个跟单一文件上传大多是相同的,不同的是多文件上传是把所有文件作为一个文件集合一起上传到服务器的,我们需要的是把这个文件集合分解成一个个单一的文件,剩下的处理方法就跟单一文件上传一样了。
首先你要知道要最多同时上传多少个文件,然后你就在form之间放多少个如下的HtmlInput控件:
<input type="file" runat="server" size="50">
注意:这里的HtmlInput控件控件是不需要设置ID的
那怎么在上传到服务器的文件集合中取出一个个的文件呢?看下面的代码:
dim i as integer
For i=0 to Request.Files.Count-1
‘使用Request.Files()来逐个获取上传的文件
dim myFile as HttpPostedFile=Request.Files(i)
'这里的myFile就相当于上例中的PostedFile,可以用myFile.FileName获得文件名,etc
'这里的处理代码就跟单一文件上传的一样了
Next
现在你已经掌握了ASP.NET文件上传技术了,只要灵活应用,美化上传界面,做出好的ASP.NET上传程序了也不是什么难事了。
=========================================
应用ASP.NET向网络服务器上传文件
许多网站通过网页收集资料,如用户反馈及博客文章等。能够收集文本很不错。但是,我们经常需要收集更为稳健的因素。例如,许多招聘网站收集求职者用Word文件提交的简历。标准HTML支持文件上传功能,但如果应用ASP.NET上传的话,还可以获得一些附加功能。
输入标签
标准HTML输入标签支持文件类型属性,这样就可以向网络服务器上传文件。以下是此标签的格式:
<input type="file" name="fileUpload" />
将输入标签放在HTML表单元素中。列表A中的代码显示ASP.NET页面中用到的文件上传控制。
在ASP.NET页面中应用上传标签还要其它两个属性:id与runat。id属性按程序访问元素,而runat属性则指明处理元素的位置。runat属性由服务器设定,所以它由网络服务器来处理。另外,HTML中还包含对齐页面项目的其它元素,和一个提交表单的按钮。
文件上传元素为用户提供两个选择上传文件的选项:在输入文本框中输入文件路径,或者选择浏览(Browse)按钮从本地文件系统中进行选择。一旦用户指定了文件,再选择提交(Submit)按钮,网络服务器即接管。(需要使用代码来处理请求和上传的文件。)
用ASP.NET上传
应用ASP.NET上传文件有几种方式,让我们看一看几种情形。最基本的途径是应用上传输入控制特性与方法。以下是HTML输入控制的方法与特性:
* FileName:用户计算机上的完全合格的文件名称。它还包含上传文件的本地路径。
* ContentLength:上传文件的大小(字节)。
* ContentType:上传文件的MIME内容类型。
* InputStream:返回一个指向上传文件的流(Stream)对象,允许你阅读文件内容。
* SaveAs:方便保存上传文件的内容。
列表B中的C#语言实例对第一个代码样本进行扩充以处理上传文件。(列表C中是对应的VB.NET实例。)此页面退回以处理上传文件。ContentLength属性可避免上传空文件。FileName利用从文件本地路径中提取文件名的字符串方法在本地保存文件。SaveAs方法将文件保存在网络服务器文件夹中。BtnSubmit按钮用它的指向表单方法的ASP.NET OnServerClick事件来触发上传文件过程。
其代码应用HtmlInputFile和HttpPostedFile类。这些类(及其集合)的完整路径为:
* System.Web.UI.HtmlControls.HtmlInputFile
* System.Web.HttpPostedFile
在输入文件元素时建立HtmlputFile对象(在我们的例子中为fileUpload)。文件由表单(与HtmlInputFile对象)提交到服务器时则建立HttpPostedFile对象。只有在页面的回传事件中,HttpPostedFile对象才有效。
HtmlInputFile对象与HTML文件输入元素对应。你可用由id属性指定的名称来访问它。它有下列特性:
* PostedFile:上传文件的内容。
* Accept:以逗号界定的MIME类型列表,指定可能提交的文件类型。
* MaxLength:要提交的文件的最长文件名长度(包括路径)。
* Size:用户输入/选择上传文件的文本框宽度。
选择文件后,就可以用代码来保存文件。HtmlinputFile的PostedFile属性控制文件是否有效的信号。在提交文件的页面与处理上传的页面为同一页面时,实例代码工作正常,但情况并非总是如此。我们来了解一下如何在不同页面中处理文件上传!
在不同页面中处理上传
我在最近的一个项目中应用一个以Flash为基础的界面来收集用户反馈及上传文件。Flash对象包含在一个HTML文件中,而上传处理与内容则位于另一个ASP.NET页面内。.NET Framework使这一处理过程变得简单。
ASP.NET Request对象中包含由用户提交的一切内容。Request类的Files特性可方便地对用户上传的文件进行访问。Files特性返回一个 HttpFileCollection类的实例,它是HttpPostedFile对象的集合(即由用户提交的文件)。这两个类可方便地处理引入的文件。列表D中的C#实例说明了这一处理过程。(列表E包含对应的VB.NET实例。)
此代码通过HttpFileCollection对象来恢复上传文件集,并通过一个for循环,以HttpPostedFile对象处理每个上传文件,并为每个对象调用SaveAs方法,将其保存在网络服务器中。
网络页面可通过表单的行为属性调用脚本。它应该指向ASP.NET页面。列表F中的HTML代码是一个样本。
安全
你应该在网络服务器中建立文件夹,将文件保存在代码指定的目录中。另外,你还要限制上传文件的类型;例如,你要阻止恶意代码,大型视频,以及给服务器造成麻烦的内容。
你可以用文件的MIME类型来限制用户上传的文件类型。HTML标准中包含一个输入元素的行为属性,你可通过包含合法的MIME类型,利用它来限制上传的内容。见列表G。
并不是所有的网络用户都支持属性,使用代码解决方案更为可靠。列表H中的代码对第一个实例做出修改,使其只接受Word文本。如果上传文件的内容类型为微软Word的MIME类型,则只对文件进行保存。
接受所有文件
自上传输入元素出现以来,接受文件上传就是一个标准的网络作法,这没有多大的改变。但是,ASP.NET简化了提交文件的过程。通过ASP.NET页面,或者标准的HTML表单,你都可以轻松地处理提交过程,并限制用户上传的内容。