天天看點

用ASP.NET的FileUpload控件實作帶對話框的FTP檔案上傳功能

      最近不得已開始做網頁,一個ASP.NET的項目,需要實作FTP上傳功能,于是上網廣搜代碼,發現FTP上傳的代碼到處都是,随手拈來,可是一般來說用戶端上傳檔案都需要一個檔案選擇對話框,正好自帶的FileUpload控件能夠實作。但是網上搜到FileUpload的PostedFile.Save方法隻能儲存到Web伺服器本地磁盤上(筆者不清楚該控件是否提供儲存到FTP上的方法,若有請指教),那麼就需要一個方法能夠結合FileUpload來實作FTP上傳。

      最開始想到的是隻要能擷取FileUpload彈出對話框選擇檔案的路徑,定義FileStream,利用FileStream.Open擷取指定路徑的檔案流,再利用FtpWebRequest.GetRequestStream()寫入這個流就可以了,但發現無法直接利用FileUpload擷取標明檔案的實體路徑。原因是擷取路徑的方法FileUpload.PostedFile.FileName在IE7/8,Chrome,Firefox浏覽器下無法獲得完整路徑,隻能獲得檔案名,詳情請見http://www.cnblogs.com/beckson/archive/2010/12/07/1899038.html。

      後來查閱MSDN關于FileUpload.PostedFile的資料,它傳回的是一個HttpPostedFile對象,發現它還有個InputStream屬性,傳回標明檔案的流,于是明白了,一樣可以用這個流寫入到FTP中。

用ASP.NET的FileUpload控件實作帶對話框的FTP檔案上傳功能

      代碼如下:

//上傳檔案按鈕事件,将檔案上傳至FTP伺服器中

protected void Btn_Upload_Click(object sender, EventArgs e)

{

//檔案上傳位址根目錄,這裡通過IIS架設本地主機為FTP伺服器

string FileSaveUri=@"ftp://localhost/";

//FTP使用者名密碼,就是本機的使用者名密碼

string ftpUser = "ftpserver";

string ftpPassWord = "1234567890";

Stream requestStream = null;

Stream fileStream = null;

FtpWebResponse uploadResponse = null;//建立FtpWebResponse執行個體uploadResponse

//Btn_Upload.

if (FileUpload.HasFile)

{

//擷取檔案長度

int FileLength=FileUpload.PostedFile.ContentLength;

//限制上傳檔案最大不能超過500M

if (FileLength < 512*1024*1024)

{

try{

//格式化為URI

Uri uri = new Uri(FileSaveUri+Path.GetFileName(FileUpload.PostedFile.FileName));

FtpWebRequest uploadRequest = (FtpWebRequest)WebRequest.Create(uri);//建立FtpWebRequest執行個體uploadRequest

uploadRequest.Method = WebRequestMethods.Ftp.UploadFile;//将FtpWebRequest屬性設定為上傳檔案

uploadRequest.Credentials = new NetworkCredential(ftpUser, ftpPassWord);//認證FTP使用者名密碼

requestStream = uploadRequest.GetRequestStream();//獲得用于上傳FTP的流

byte[] buffer = new byte[FileLength];

fileStream=FileUpload.PostedFile.InputStream;//截取FileUpload擷取的檔案流,作為上傳FTP的流

fileStream.Read(buffer, 0, FileLength);

requestStream.Write(buffer, 0, FileLength);//将buffer寫入流

requestStream.Close();

uploadResponse = (FtpWebResponse)uploadRequest.GetResponse();//傳回FTP伺服器響應,上傳完成

//上傳成功

}

catch (Exception ex){

//無法上傳

}

finally{

if (uploadResponse != null)

uploadResponse.Close();

if (fileStream != null)

fileStream.Close();

if (requestStream != null)

requestStream.Close();

}

}//end if #FileLength#

else

{

//上傳檔案過大

}

}//end if #FileUpload.HasFile#

else{

//未選擇檔案

}

}