2011-07-25 16 views
0

webclientを使用してZipファイルをダウンロードすると、正しくダウンロードされて保存されていないように見えますが、zipファイルは無効または破損しています。しかし、ソースzipファイルは、有効なzipファイルであるようです。c#WebClient Zipをダウンロードすると壊れます

ダウンロードコード:

using (WebClient webClient = new WebClient()) 
     { 
      webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed); 
      webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged); 
      webClient.DownloadFileAsync(new Uri(URL), downloadZipFilename); 
     } 
private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e) 
    { 
     progressBar.Value = e.ProgressPercentage; 
    } 

    private void Completed(object sender, AsyncCompletedEventArgs e) 
    { 
     //unzip 
     using (ZipFile zipFile = ZipFile.Read(currentTemporaryDownloadFileUrl)) 
     { 
      zipFile.ExtractAll(currentTargetFileUrl); 
     } 
     File.Delete(currentTemporaryDownloadFileUrl); 
     DownloadFinished(this,EventArgs.Empty); 
     Console.WriteLine("File finished downloading."); 
    } 

ジップエキスが破損として起動します。

Serverコード:サーバー上の

//send file 
        e.Response.Connection.Type = HttpServer.Headers.ConnectionType.Close; 
        byte[] buffer = ReadFile(filePath); 
        e.Response.Body.Write(buffer, 0, buffer.Length); 

のReadFileは:

public static byte[] ReadFile(string filePath) 
     { 
      // this method is limited to 2^32 byte files (4.2 GB) 

      FileStream fs = File.OpenRead(filePath); 
      try 
      { 
       byte[] bytes = new byte[fs.Length]; 
       fs.Read(bytes, 0, Convert.ToInt32(fs.Length)); 
       fs.Close(); 
       return bytes; 
      } 
      finally 
      { 
       fs.Close(); 
      } 
     } 

ここで何が悪いのでしょうか?あなたはcurrentTemporaryDownloadFileUrlを使用Completed方法をintながらdownloadZipFilenameを使用WebClientコールで

おかげで、 クリスチャン・スチュワート

+0

あなたは 'ReadFile'にメモリ不足することができます。 –

+1

ダウンロードしたファイルとサーバー上のファイルを比較しましたか? –

+0

アイデア?誰でも –

答えて

0

ZIPファイルをメモリにロードするのではなく、どのように使用すると、出力ストリームに直接バッファリングせずにメモリ消費を最小限に抑えることができます。

+0

ああ、私は、サーバー上でファイルをストリーミングしていることがわかります。これを使ってみましょう。 –

+0

こんにちは、これを使用する方法を理解できないようです。なぜなら、応答変数にはTransmitFileが用意されていないからです。私はちょうど私が最終的にここにやってしまった何を助け –

0

は...それはCompleted方法は、いくつかの他のファイルとダウンロードしたものを解凍しようとするだろうか?

サーバコードは< = 2GB(Int32はintの別名です)は... 2GB以上のファイルですか? ファイルが大きければ、サーバーコードは「残り」(2GB以上)のすべてのバイトを0x00として送信し、ZIPが壊れてしまう...

+0

こんにちは、それは2GBよりずっと少なく、テストのためにわずか数キロバイトです。 2つの文字列は同じでなければならず、コードの初期に設定されています。 –

0

クライアントからのサーバー送信を解読して解凍することをお勧めします。そのようにして発生した問題を特定することができます。

サーバーが「zipファイルを作成して送信する」ことが正しく機能することを確認してください。ブラウザーからサーバーを起動し、zipファイルを正常に展開できることを確認してください。次に、C#クライアントを追加して、zipファイルをプログラムでダウンロードして解凍します。

+0

ため:)おかげで、私は、各ファイルを詰めということでした(私はここに答えを受け入れたことはありません実現)、それを送った場所を覚えていけない、どこからか、そのクラスをHttpServerを使用していますそれから解凍しました - ここでの問題は私がそれを記憶に残していたことでした。代わりに、私は今すぐ一時フォルダにファイルをダウンロードしてからそこから抽出します。 –

関連する問題