2011-12-13 14 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

(私の頭の上から)で

 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(); } 

を置き換えることができます。どうして?どのようなエラーを処理していますか、それをどのように処理しようとしていますか?ファイルをアップロードしていますか? – David

+0

@David - キャッチブロックは、有効なFTP接続を確認することです。どこかを選んだ(おそらくここにいる) –

+1

それは間違いなくあなたが修正したいものです。私はあなたが報告している問題の根本的な原因を発見していませんが、ロジックフローに 'try/catch'を使用することは良い考えではありません。 – David

答えて

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エンコーディングでは非常に長い文字列、としてそれを読み込み、ファイルサイズ。

+0

Genius !!すぐに働いた –

+1

+1。破損したファイルでも私の問題を解決しました。 MSDNのサンプルを使用していましたが、UTF-8エンコーディングはそれ以上の説明はありません。 "CopyTo"メソッドは.NET 4.0以上であることに注意してください。 (私のプロジェクトが.NET 3.5にデフォルト設定されているので、私は1分間私を困らせた) –

+0

@StephanKellerそれは私のコードもある –

2

なぜこのすべてがファイルをデコードして再エンコードするのですか?あなたは2つのストリームを持っていますか?ディスク上にある同じファイルをサーバーに存在させたいのですか? Stream.CopyToは、エラーが起こりにくいでしょう。

あなたは、あなたがその `catch`ブロックに_lot_をやっている

using (var fs = File.OpenRead(fi_attachment.FullName)) 
using (Stream upload_request_stream = upload_request.GetRequestStream()) 
{ 
    fs.CopyTo(upload_request_stream); 
} 
関連する問題