在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" %>
<s cript 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="文件上傳成功!<br>上傳文件名:" & FileName
End If
End Sub
</s cript>
<html>
<body>
<form runat="server" enctype="multipart/form-data">
<input type="file" id="UploadFile" runat="server" size="50"><br>
<asp:button runat="server" Text="立即上傳" onClick="Upload" />
</form>
<hr><br>
<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表單,你都可以輕鬆地處理提交過程,並限制用戶上傳的內容。