在常見的B/S模式下企業級架構中上傳檔案是一個常見業務操作.在.NET 1.1版本是隻有對應的用戶端HTML版本的Input<Type="File">,在.NET2.0版本添加進來了伺服器端的FileUpload控件.
其實考慮在設計這個控件時為了保證.NET安全機制.預設設定是檔案上傳的大小是2M. 當然可以通過修改系統的Web.Config配置檔案達到4M. 其實相對而言Fileupload是一把雙刃劍.使用時揚長避短是很重要的.
開發者應該了解的是,之是以預設的檔案大小上限為4MB,并不是因為當時的設計人員靈光一現,而是為了避免潛在DOS攻擊危險。若是攻擊者送出了一個或多個大檔案,往往會讓伺服器不堪重負。若是使用者上傳的檔案大于4MB,将會得到“Maximum request length exceeded.”異常資訊. 當然這些就涉及到Asp.net平台下大檔案上傳的問題作為下一節讨論并實作. 本章主要實作的是利用Asp.net中FileUpload控制的一些基本操作.
最近裝上VS2010 Beta2版本. NET FrameWork 4.0.(關系不大)試用一下.以下的項目編碼都在該環境下運作.
(A):簡單檔案上傳操作 頁面代碼:
--前台一個上傳控件 接着是一個上傳按鈕
<asp:FileUpload ID="FileUpload5" runat="server" Width="475px"></asp:FileUpload>
<asp:Button ID="TestFileType" runat="server" Text="上傳檔案-判斷檔案類型"
onclick="TestFileType_Click" OnClientClick="CheckFileType()" ></asp:Button>
背景Button時間操作代碼:
//向伺服器上傳檔案-BasicOperatorDemo(基本操作示範) -最簡單操作
//Author:chenkai Date:2009年11月10日14:22:36
protected void bt_upload_Click(object sender, EventArgs e)
{
try {
if (FileUpload1.PostedFile.FileName == "")
{
this.lb_info.Text = "請選擇您要上傳的檔案!";
}
else
string filepath = FileUpload1.PostedFile.FileName.ToString();
string filename = filepath.Substring(filepath.LastIndexOf("\\") + 1);
string serverpath = HttpContext.Current.Server.MapPath("Images/") + filename;
//儲存到伺服器上 判斷檔案目錄是否存在
if (File.Exists(serverpath))
{
FileUpload1.SaveAs(serverpath);
this.lb_info.Text = "檔案上傳成功!";
}
else
//建立儲存目錄
File.Create(serverpath);
}
catch (Exception se)
{
this.lb_info.Text = "上傳過程發生錯誤!錯誤原因:" + se.ToString();
}
再次逐漸的提高要求: A:限制用戶端上傳檔案的檔案類型. 隻能上傳制定的.JPG/.Jpeg/.chm 3種類型的檔案. 用戶端驗證模式:
<Script language="JavaScript" Type="JS/Text">
//定義一個用戶端JS函數來判斷上傳檔案的類型 在Button onClintClick事件調用
function CheckFileType() {
//盡然可以直接調用伺服器端控件
var str = document.getElementById("FileUpload5").value;
alert(str);
var pos = str.lastIndexOf(".");
var lastname = str.substring(pos,str.length)
if (lastname.toLowerCase()!=".jpg" && lastname.toLowerCase()!=".gif")
{
alert("您上傳的檔案類型為"+lastname+",圖檔必須為.jpg,.gif類型");
return false;
}
else
return true;
}
</Script>
上傳制定檔案類型伺服器端驗證模式:
/// <summary>
/// 檢測真正的上傳檔案類型資料
/// Author:chenkai Date:2009年11月11日10:44:26
/// </summary>
public bool CheckClintFileType(FileUpload getfile)
//獲得資料
System.IO.FileStream getstream=new FileStream(getfile.FileName,FileMode.Open,FileAccess.Read);
System.IO.BinaryReader getreader = new BinaryReader(getstream);
string fileclass = string.Empty;
byte buffer;
try
//讀取的檔案流轉化成二進制檔案
buffer = getreader.ReadByte();
fileclass = buffer.ToString();
//再次疊加
本文轉自chenkaiunion 51CTO部落格,原文連結:http://blog.51cto.com/chenkai/765300