我正在從couchbase中獲取一個對象,其中一個字段中有一個文件。該文件被壓縮,然後在base64中編碼。從字符串中解壓縮Zip文件
我怎樣才能把這個字符串解壓縮回原始文件?
然後,如果我使用ASP.MVC 4 - 我會如何將它作爲可下載文件發送回瀏覽器?
原始文件正在Linux系統上創建並在Windows系統(C#)上解碼。
我正在從couchbase中獲取一個對象,其中一個字段中有一個文件。該文件被壓縮,然後在base64中編碼。從字符串中解壓縮Zip文件
我怎樣才能把這個字符串解壓縮回原始文件?
然後,如果我使用ASP.MVC 4 - 我會如何將它作爲可下載文件發送回瀏覽器?
原始文件正在Linux系統上創建並在Windows系統(C#)上解碼。
您應該使用Convert.FromBase64String
獲取字節,然後解壓縮,然後使用Controller.File
讓客戶端下載文件。要解壓縮,您需要使用某種ZIP庫打開zip文件。 .NET 4.5的內置ZipArchive
類應該可以工作。或者您可以使用另一個庫,支持從流讀取SharpZipLib和DotNetZip。
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
來幫助您,對於最常見的類型。
我以前用這種類型的任務成功地使用了SharpZipLib。
對於一個非常接近你需要做的例子看看here。
基本上,步驟應該是這樣的:
ZipFile
類更新
如果字符串包含只有文件(不是一個完整的Zip文件)的壓縮內容,那麼你可以簡單地使用GZipStream類.NET解壓內容。你可以找到一個樣本here。但是,最初的步驟與上面相同(從db獲取字符串,寫入內存流,將內存流作爲輸入提供給GZipStream進行解壓縮)。
謝謝 - 但它似乎很過時,沒有任何文件:/ – JohnMighty
@JohnMighty - 不,它不過時。這是相當廣泛的使用和樣本,看看我更新的答案中的鏈接。 –
我意識到.NET 4.5包含一個可以工作的'ZipArchive'類。更新我的答案以使用它。我還沒有嘗試過,所以你可能需要重新修改讀完'byte []'或'Stream'的方式。 –
完美!很有幫助。 – JohnMighty