2010-12-17 71 views
1

我試圖創建一個ZIP文件,它可能包含幾千張圖片。HttpContext.Current.Response在下載管理器啓動後寫入文件

公共靜態無效CompressAndSendFiles(列表文件) { HttpContext.Current.Response.ClearContent();

// LINE1: Add the file name and attachment, which will force the open/cance/save dialog to show, to the header 
    HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=\"Jpeg Package " 
              + DateTime.Now.ToString("MM-dd-yyyy hh-mm-ss") + ".zip\""); 

    // Add the file size into the response header 
    //HttpContext.Current.Response.AddHeader("Content-Length", file.Length.ToString()); 

    // Set the ContentType 
    HttpContext.Current.Response.ContentType = ReturnHttpContentType("download.zip"); 

    ZipOutputStream oZipStream = 
        new ZipOutputStream(HttpContext.Current.Response.OutputStream); 

    try 
    { 
     foreach (string file in files) 
     { 


      FileInfo fInfo = new FileInfo(file); 
      ZipEntry oZipEntry = new ZipEntry(fInfo.Name); 
      oZipStream.PutNextEntry(oZipEntry); 
      byte[] buffer = File.ReadAllBytes(file); 
      oZipStream.Write(buffer, 0, buffer.Length); 

      //oZipStream.Flush(); 
     } 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
    finally 
    { 
     oZipStream.Finish(); 
     oZipStream.Close(); 
     oZipStream.Dispose(); 

    } 
    HttpContext.Current.Response.OutputStream.Flush(); 
    HttpContext.Current.Response.End(); 
} 

一切都很好,除非當文件數量變大。

我的問題: 有沒有辦法啓動下載(讓客戶端的下載管理器彈出),然後開始寫入流?

我監視了w3wp.exe(IIS)進程,看起來數據正在寫入內存而不是Stream。當w3wp.exe內存使用率增加一定數量時,它會釋放內存並且什麼都不會發生(無需下載)。

預先感謝您。

回答

2

您是否嘗試過使用它?

HttpContext.Current.Response.BufferOutput = false; 
+0

快樂250k代表! (好吧,還不是很好,但是當它命中:)) – RCIX 2010-12-17 21:19:55

+0

謝謝你的工作!沒有你是C#神的雙倍! – 2010-12-17 21:24:22

+0

嗨Arash,我遇到了同樣的問題。你能否展示最終的代碼如何解決這個問題。 – 2011-03-28 13:52:53

1

據我所知,你不能在歸檔時進行流式處理。你需要先壓縮他們,然後流式傳輸。結果是,如果最終的壓縮文件非常大,服務器終將內存不足。

我最終做的是將它寫入一個臨時zip文件,然後傳輸該臨時文件。