2011-12-13 117 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); 
}