2015-09-23 45 views
3

我正在使用ZipArchive和一個處理程序來向使用內存流和Web處理程序的用戶提供服務。本地這是工作,直到我上傳應用程序到現場。ZipArchive在實時服務器上提供無效文件

這是我的代碼。

using (ZipArchive newArchive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true)) 
{ 
    newArchive.CreateEntryFromFile(fileName, Path.GetFileName(fileName)); 
    if (File.Exists(acRefFile)) 
    { 
     newArchive.CreateEntryFromFile(acRefFile, 
      newACRefName + Path.GetExtension(acRefFile)); 
    } 
    else 
    { 
     SystemLogManager sysLogMgr = new SystemLogManager(); 
     sysLogMgr.AddErrorMessage(acRefFile, "File not found"); 
    } 
    if (File.Exists(exRefFile)) 
    { 
     newArchive.CreateEntryFromFile(exRefFile, 
      newExRefName + Path.GetExtension(exRefFile)); 
    } 
    else 
    { 
     SystemLogManager sysLogMgr = new SystemLogManager(); 
     sysLogMgr.AddErrorMessage(exRefFile, "File Not Found"); 
    } 
    if (File.Exists(exRef2File)) 
    { 
     newArchive.CreateEntryFromFile(exRef2File, 
      newExRef2Name + Path.GetExtension(exRef2File)); 
    } 
} 
memoryStream.Position = 0; 
byte[] bytes = memoryStream.GetBuffer(); 
context.Response.Buffer = true; 
context.Response.Clear(); 
context.Response.ContentType = "application/zip"; 
context.Response.AddHeader("content-disposition", 
    string.Format("attachment; filename =app_{0}_{1}.zip", appForm.Cand_sno, 
     appForm.App_year)); 
context.Response.BinaryWrite(bytes.ToArray()); 
context.Response.Flush(); 

下圖顯示了下載的zip文件和生成的錯誤。 Zip error

那麼有什麼代碼可能是錯誤的或我可以嘗試服務器端?

更新1: 根據收到的評論,我嘗試將zip文件直接添加到服務器上。同樣的問題發生在zip被「損壞」。

更新2: 進一步的調查我現在發現,使用7zip但不是標準的Windows提取時,zip文件打開。當右鍵單擊提取所有消息狀態時,zip爲空。

謝謝

+0

您的開發機器和服務器是基於Windows的機器嗎?你有沒有檢查服務器事件/應用程序日誌? –

+0

開發和服務器都是基於windows的,同時運行.net的正確版本。我查看了應用程序日誌,注意到它是一個可能的原因。 – Dashwall

+0

每次都是「損壞」還是10次是9次? –

回答

3

因此,對於這個問題的修復只是改變byte[] bytes = MemoryStream.GetBuffer();byte[] bytes = MemoryStream.ToArray();這樣做是隻得到了使用字節而不是額外的字節的緩衝區補充道。

+0

這個固定我的問題也是如此。 result.Content = new ByteArrayContent(memoryStream.ToArray()); –

0

我使用ZipFile類,結果永遠不會損壞。 你可以試試嗎?

ZipFile.CreateFromDirectory("C:\somefolder", "C:\someotherfolder\somefile.zip"); 
+0

ZipFile看起來好像直接從目錄內容創建zip文件。我不想使用來自不同位置的一組指定文件創建的zip文件。 – Dashwall

+0

這是正確的,但如果ZipFile工作正常,你可以創建一個方法1)將所有文件複製到一個臨時目錄2)將目錄壓縮到一個臨時壓縮文件3)刪除臨時目錄4)返回壓縮文件 –

相關問題