2012-05-20 71 views
1

我使用C#-MVC3。我有一個「導出」頁面。我有一些從DB中導出不同表的函數,每個函數都會從表中創建一個CSV文件並向用戶返回一個FileContentResult文件。將FileContentResult文件導出爲ZIP

現在我想創建一個「全部導出」按鈕,一次下載所有文件。 我試圖使用ZipFile,但它只獲取文件名和路徑 - 保存在服務器上的文件,而不是「FileContentResult」文件。

所以我想暫時將「FileContentResult」文件保存在服務器上,將它們壓縮並刪除它們 - 但我找不到如何保存「FileContentResult」文件。

如果你能幫助我或給我另一個想法,我會很高興聽到。

回答

1

我的解決方案:

public ZipFile DownloadAllToZip() 
    { 
     string path = "c:\\TempCSV"; 
     try 
     { 
      if (Directory.Exists(path)) 
      { 
       EmptyFolder(path); 
      } 
      else 
      { 
       DirectoryInfo di = Directory.CreateDirectory(path); 
      } 
      List<FileContentResult> filesToExport = GetAllCSVs(); 

      foreach (var file in filesToExport) 
      { 
       try 
       { 
        using (FileStream stream = new FileStream(path + "\\" + file.FileDownloadName, FileMode.CreateNew)) 
        { 
         using (StreamWriter writer = new StreamWriter(stream, Encoding.UTF8)) 
         { 
          byte[] buffer = file.FileContents; 
          stream.Write(buffer, 0, buffer.Length); 
          writer.Close(); 
         } 
        } 
       } 
       catch { } 
      } 
     } 
     catch{ } 

     Response.Clear(); 
     Response.BufferOutput = false; 
     Response.ContentType = "application/zip"; 
     Response.AddHeader("content-disposition", "attachment; filename=MaterialAssetTracker.zip"); 
     ZipFile zip= new ZipFile(); 
     using (zip) 
     { 
      zip.CompressionLevel = CompressionLevel.None; 
      zip.AddSelectedFiles("*.csv", path + "\\", "", false); 
      zip.Save(Response.OutputStream); 
     } 
     Response.Close(); 
     EmptyFolder(path); 
     return zip; 
    }