【问题标题】:Decompressing a Zip file from a string从字符串中解压缩 Zip 文件
【发布时间】:2013-09-24 15:14:53
【问题描述】:

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

我怎样才能获取这个字符串并将其解压缩回原始文件?

那么,如果我使用的是 ASP.MVC 4 - 我如何将它作为可下载文件发送回浏览器?

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

【问题讨论】:

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


    【解决方案1】:

    您应该使用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 类型。

    【讨论】:

    • 我意识到 .NET 4.5 包含一个可以工作的 ZipArchive 类。更新了我的答案以使用它。我还没有尝试过,所以你可能需要修改如何完成阅读 byte[] 或 Stream 的条目。
    • 完美!很有帮助。
    【解决方案2】:

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

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

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

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

    更新

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

    【讨论】:

    • 谢谢 - 但它似乎已经过时并且没有任何文档:/
    • @JohnMighty - 不,它没有过时。它被广泛使用,就样本而言,请查看我更新答案中的链接。
    猜你喜欢
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多