2011-07-25 27 views
0

下載zip文件與webclient似乎不能正常工作,一旦下載並保存壓縮文件出現無效或損壞,用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(); 
      } 
     } 

這裏有什麼錯?

感謝, 基督教斯圖爾特

+0

您可能在'ReadFile'中耗盡內存。 –

+1

您是否將下載的文件與服務器上的文件進行了比較? –

+0

任何想法?任何人 –

回答

0

而不是低效地將ZIP文件加載到內存中,然後寫出來,有關使用

e.Response.TransmitFile(filePath); 

的TransmitFile直接流至輸出流沒有緩衝,從而減少內存消耗如何。

+0

啊,我明白了,在服務器上流式傳輸文件。讓我看看使用這個。 –

+0

嗨,我似乎無法弄清楚如何使用這個,因爲響應變量沒有TransmitFile可用。我使用HttpServer,它來自某個地方的類,我只是不記得在哪裏:)感謝您的幫助 –

0

WebClient通話使用downloadZipFilename而INT的Completed方法使用currentTemporaryDownloadFileUrl ...會不會是該Completed方法試圖解壓縮其他一些文件,並下載一個?

您的服務器代碼僅支持< = 2 GB(Int32是int的別名,已簽名!)...是大於2 GB的文件嗎? 如果文件較大,那麼你的服務器代碼發送「休息」(大於2 GB)的所有字節爲0x00,這絕對會使ZIP損壞...

+0

嗨,它遠小於2GB,只有幾千字節的測試。這兩個字符串應該是相同的,它們在代碼的早期設置。 –

0

我建議你從客戶端讀取和解壓縮服務器傳輸。這樣你可以隔離出現的任何問題。

確保服務器「創建並傳輸zip文件」的東西正常工作。嘗試從瀏覽器訪問服務器,確保您可以成功解壓zip文件。然後添加C#客戶端,以編程方式下載並解壓zip文件。

+0

我最終在這裏做了什麼(剛纔意識到我從來沒有接受過答案)是我打包每個文件,發送它,然後解壓縮它 - 這裏的問題是我將它保存在內存中。相反,我現在只需將文件下載到一個臨時文件夾,然後從那裏提取。 –