2011-12-13 72 views
2

我在C#中編寫了一個函數來上傳文件,當複製到文件共享不起作用時。我注意到,任何上傳的文件都是原始文件大小的1.5-2倍,並且是無效文件。這裏是代碼:ftp上傳太大

public bool save_FTPUpload(FileInfo fi_attachment) 
{ 
    bool fileSaved = false; 
    string filename = fi_attachment.Name; 

    while (!fileSaved) 
    { 
     string file_ftpURI = string.Format("{0}/{1}", ftpURI, filename); 
     FtpWebRequest file_exist_request = (FtpWebRequest)FtpWebRequest.Create(file_ftpURI); 
     file_exist_request.Credentials = new NetworkCredential(ftp_user, ftp_pass); 
     file_exist_request.Method = WebRequestMethods.Ftp.GetFileSize; 
     try 
     { 
      FtpWebResponse response = (FtpWebResponse)file_exist_request.GetResponse(); 
     } 
     catch (WebException ex) 
     { 
      FtpWebResponse response = (FtpWebResponse)ex.Response; 
      if (response.StatusCode == 
       FtpStatusCode.ActionNotTakenFileUnavailable) 
      { 
       FtpWebRequest upload_request = (FtpWebRequest)FtpWebRequest.Create(file_ftpURI); 
       upload_request.Credentials = new NetworkCredential(ftp_user, ftp_pass); 

       upload_request.Method = WebRequestMethods.Ftp.UploadFile; 
       upload_request.UsePassive = true; 
       upload_request.UseBinary = true; 
       upload_request.KeepAlive = false; 

       StreamReader attachment = new StreamReader(fi_attachment.FullName); 
       byte[] attachmentData = Encoding.UTF8.GetBytes(attachment.ReadToEnd()); 
       upload_request.ContentLength = attachmentData.Length; 

       //Stream upload_request_stream = upload_request.GetRequestStream(); 
       using (Stream upload_request_stream = upload_request.GetRequestStream()) 
       { 
        upload_request_stream.Write(attachmentData, 0, attachmentData.Length); 
        upload_request_stream.Close(); 
       } 
       FtpWebResponse upload_response = (FtpWebResponse)upload_request.GetResponse(); 

       fileSaved = true; 
      } 
     } 
    } 
    return fileSaved; 
} 

任何幫助搞清楚這將是偉大的。

+1

你做在`catch`塊_lot_。爲什麼?你在處理什麼錯誤,你是如何處理它的?通過...上傳文件? – David 2011-12-13 19:38:50

+0

@David - catch塊用於檢查有效的FTP連接。拿起它在某處(可能在這裏) – 2011-12-13 19:43:30

回答

7

您需要在二進制模式的文件中的內容複製,就像這樣:

var response = (FtpWebResponse)ex.Response; 
if (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable) { 
    FtpWebRequest upload_request = (FtpWebRequest)FtpWebRequest.Create(file_ftpURI); 
    upload_request.Credentials = new NetworkCredential(ftp_user, ftp_pass); 
    upload_request.Method = WebRequestMethods.Ftp.UploadFile; 
    upload_request.UsePassive = true; 
    upload_request.UseBinary = true; 
    upload_request.KeepAlive = false; 
    var attachment = File.Open(fi_attachment.FullName, FileMode.Open); 
    using (Stream upload_request_stream = upload_request.GetRequestStream()) { 
     attachment.CopyTo(upload_request_stream); 
     upload_request_stream.Close(); 
    } 
    var upload_response = (FtpWebResponse)upload_request.GetResponse(); 
    fileSaved = true; 
} 

您當前的程序讀取它作爲UTF-8編碼一個很長的字符串,這大概佔了變化文件大小。

2

爲什麼所有這些舞蹈解碼一個文件然後重新編碼它?你有兩條流?你想要在磁盤上存在的文件存在於服務器上嗎? Stream.CopyTo會大大減少錯誤。

您可以取代

   StreamReader attachment = new StreamReader(fi_attachment.FullName); 
       byte[] attachmentData = Encoding.UTF8.GetBytes(attachment.ReadToEnd()); 
       upload_request.ContentLength = attachmentData.Length; 

       //Stream upload_request_stream = upload_request.GetRequestStream(); 
       using (Stream upload_request_stream = upload_request.GetRequestStream()) 
       { 
        upload_request_stream.Write(attachmentData, 0, attachmentData.Length); 
        upload_request_stream.Close(); 
       } 

與(把我的頭頂部)

using (var fs = File.OpenRead(fi_attachment.FullName)) 
using (Stream upload_request_stream = upload_request.GetRequestStream()) 
{ 
    fs.CopyTo(upload_request_stream); 
}