从 byte[] 创建 zip 并返回浏览器

本文关键字:返回 浏览器 zip 创建 byte | 更新日期: 2023-09-27 18:29:37

我想创建一个zip文件并将其返回给浏览器,以便它将zip下载到下载文件夹中。

              var images = imageRepository.GetAll(allCountryId);
        using (FileStream f2 = new FileStream("SudaAmerica", FileMode.Create))
        using (GZipStream gz = new GZipStream(f2, CompressionMode.Compress, false))
        {
            foreach (var image in images)
            { 
                gz.Write(image.ImageData, 0, image.ImageData.Length);
            }
            return base.File(gz, "application/zip", "SudaAmerica");
        }

我已经尝试了上述方法,但随后出现错误,指出流已处理。

这可能吗,或者我应该使用另一个库而不是 gzipstream?

从 byte[] 创建 zip 并返回浏览器

这里的问题正是它所说的:您正在根据gz递给它一些东西,但是在您离开using的那一刻,gz被处理掉了。

一种选择是等到using块之外,然后告诉它使用您刚刚编写的内容的文件名("SudaAmerica"(。但是,IMO 您实际上根本不应该在这里编写文件。如果改用MemoryStream,则可以使用 .ToArray() 获取内容的byte[],可以在 File 方法中使用。这不需要 IO 访问,这在大约 20 种不同的方式中是胜利的。好吧,也许有3种方式。但。。。

var images = imageRepository.GetAll(allCountryId);
using (MemoryStream ms = new MemoryStream())
{
    using (GZipStream gz = new GZipStream(ms, CompressionMode.Compress, false))
    {
        foreach (var image in images)
        { 
            gz.Write(image.ImageData, 0, image.ImageData.Length);
        }
    }
    return base.File(ms.ToArray(), "application/zip", "SudaAmerica");
}

请注意,gzip 流与.zip存档不同,所以我非常怀疑这是否会得到您想要的结果。Zip 存档创建可在 .NET 框架中的其他地方使用,但不能通过 GZipStream 创建。

你可能想要ZipArchive