从字符串中解压缩Zip文件

时间:2013-09-24 15:14:54

标签: c# asp.net-mvc zip gzip couchbase

我从couchbase中获取一个对象,其中一个字段有一个文件。该文件已压缩,然后以base64编码。

我如何能够获取此字符串并将其解压缩回原始文件?

然后,如果我使用ASP.MVC 4 - 如何将其作为可下载文件发送回浏览器?

原始文件正在Linux系统上创建,并在Windows系统(C#)上解码。

2 个答案:

答案 0 :(得分:1)

您应该使用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来帮助您获得最常见的类型。

答案 1 :(得分:0)

我过去曾成功使用SharpZipLib这类任务。

有关您需要做的非常接近的示例,请查看here

基本上,步骤应该是这样的:

  • 您将压缩输入作为数据库中的字符串
  • 创建一个MemoryStream并将字符串写入其中
  • 寻找内存流的开头
  • 使用MemoryStream作为SharpZipLib ZipFile
  • 的输入
  • 按照上面提供的示例解压缩ZipFile的内容

<强>更新

如果字符串仅包含文件的压缩内容(不是完整的Zip存档),那么您可以简单地使用.NET中的GZipStream类来解压缩内容。您可以找到示例here。但是初始步骤与上面相同(从db获取字符串,写入内存流,将内存流作为GZipStream的输入进行解压缩)。