最近不得已開始做網頁,一個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中。
代碼如下:
//上傳檔案按鈕事件,将檔案上傳至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{
//未選擇檔案
}
}