2016-01-08 40 views
1

我想創建一個zip文件並將其返回給瀏覽器,以便它將zip下載到downloads文件夾。從byte []創建zip並返回到瀏覽器

   var images = imageRepository.GetAll(allCountryId); 

     using (FileStream f2 = new FileStream("SudaAmerica", FileMode.Create)) 
     using (GZipStream gz = new GZipStream(f2, CompressionMode.Compress, false)) 
     { 
      foreach (var image in images) 
      { 
       gz.Write(image.ImageData, 0, image.ImageData.Length); 
      } 
      return base.File(gz, "application/zip", "SudaAmerica"); 
     } 

我試圖以上但後來我碰到一個錯誤說流佈置。

這是可能的,或者我應該使用另一個庫,然後gzipstream?

+0

複製GZ流成內存流,不關閉它。文件處理程序將爲您做到這一點。 – Vince

回答

4

這裏的問題正是它所說的:你正在遞交一些基於gz的東西,但是gz在你離開using時得到處置。

一種選擇是等待,直到using塊,然後告訴它使用你剛纔寫的東西("SudaAmerica")的。然而,國際海事組織你不應該在這裏寫的文件在所有。如果您改爲使用MemoryStream,則可以使用.ToArray()獲取內容的byte[],您可以在File方法中使用該內容。這不需要IO訪問,這在大約20種不同的方式中是勝利的。那麼,也許3種方式。但是......

var images = imageRepository.GetAll(allCountryId); 
using (MemoryStream ms = new MemoryStream()) 
{ 
    using (GZipStream gz = new GZipStream(ms, CompressionMode.Compress, false)) 
    { 
     foreach (var image in images) 
     { 
      gz.Write(image.ImageData, 0, image.ImageData.Length); 
     } 
    } 
    return base.File(ms.ToArray(), "application/zip", "SudaAmerica"); 
} 

注意,一個gzip流同樣作爲.zip存檔,所以我很懷疑這將有你想要的結果。在.net框架的其他地方可以使用Zip存檔創建,但它是而不是,通過GZipStream

你可能想ZipArchive

+1

感謝您指點我正確的方向! ZipArchive的工作完美:)我用這個線程的例子:http://stackoverflow.com/questions/17217077/create-zip-file-from-byte –

+0

@DanielGustafsson沒問題!感謝您接受提示 - 如果您指出這種類型的東西,有時候人們反應會很糟糕 –

+0

@DanielGustafsson注意:如果image.ImageData是一個byte [],那麼這個鏈接的例子中的* innermost *'MemoryStream'是多餘的 - 您可以使用'Write',它與'gz.Write(...)'非常相似,但是'zipEntryStream.Write(...)'。 –

相關問題