2013-09-24 68 views
1

我正在從couchbase中獲取一個對象,其中一個字段中有一個文件。該文件被壓縮,然後在base64中編碼。從字符串中解壓縮Zip文件

我怎樣才能把這個字符串解壓縮回原始文件?

然後,如果我使用ASP.MVC 4 - 我會如何將它作爲可下載文件發送回瀏覽器?

原始文件正在Linux系統上創建並在Windows系統(C#)上解碼。

回答

0

您應該使用Convert.FromBase64String獲取字節,然後解壓縮,然後使用Controller.File讓客戶端下載文件。要解壓縮,您需要使用某種ZIP庫打開zip文件。 .NET 4.5的內置ZipArchive類應該可以工作。或者您可以使用另一個庫,支持從流讀取SharpZipLibDotNetZip

public ActionResult MyAction() 
{ 
    string base64String = // get from Linux system 
    byte[] zipBytes = Convert.FromBase64String(base64String); 
    using (var zipStream = new MemoryStream(zipBytes)) 
    using (var zipArchive = new ZipArchive(zipStream)) 
    { 
     var entry = zipArchive.Entries.Single(); 
     string mimeType = MimeMapping.GetMimeMapping(entry.Name); 
     using (var decompressedStream = entry.Open()) 
      return File(decompressedStream, mimeType); 
    } 
} 

您還需要MIME類型的文件,你可以使用MimeMapping.GetMimeMapping來幫助您,對於最常見的類型。

+0

我意識到.NET 4.5包含一個可以工作的'ZipArchive'類。更新我的答案以使用它。我還沒有嘗試過,所以你可能需要重新修改讀完'byte []'或'Stream'的方式。 –

+0

完美!很有幫助。 – JohnMighty

0

我以前用這種類型的任務成功地使用了SharpZipLib

對於一個非常接近你需要做的例子看看here

基本上,步驟應該是這樣的:

  • 你得到的壓縮輸入從數據庫
  • 字符串創建一個MemoryStream和寫入字符串它
  • 尋求回內存流的開始
  • 使用MemoryStream作爲SharpZipLib的輸入ZipFile
  • 按照上面提供的示例解壓縮內容ËZipFile的

更新

如果字符串包含只有文件(不是一個完整的Zip文件)的壓縮內容,那麼你可以簡單地使用GZipStream類.NET解壓內容。你可以找到一個樣本here。但是,最初的步驟與上面相同(從db獲取字符串,寫入內存流,將內存流作爲輸入提供給GZipStream進行解壓縮)。

+0

謝謝 - 但它似乎很過時,沒有任何文件:/ – JohnMighty

+0

@JohnMighty - 不,它不過時。這是相當廣泛的使用和樣本,看看我更新的答案中的鏈接。 –