从字符串中解压缩 Zip 文件

本文关键字:Zip 文件 解压缩 字符串 | 更新日期: 2023-09-27 18:32:32

我正在从其中一个字段包含文件的 couchbase 获取一个对象。该文件被压缩,然后以base64编码。

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

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

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

从字符串中解压缩 Zip 文件

应使用

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 来帮助您获取最常见类型的 MIME 类型。

我过去曾成功地使用SharpZipLib来完成此类任务。

有关与您需要执行的操作非常接近的示例,请查看此处。

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

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

更新

如果字符串仅包含文件的压缩内容(而不是完整的 Zip 存档),则只需使用 .NET 中的 GZipStream 类来解压缩内容。您可以在此处找到示例。但初始步骤与上述相同(从数据库获取字符串,写入内存流,将内存流作为输入到 GZipStream 进行解压缩)。