从 byte[] 和 return 创建 zip 到浏览器

create zip from byte[] and return to browser

我想创建一个 zip 文件并将其 return 到浏览器,以便浏览器将 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?

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

一个选择是等到 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 存档,所以我非常怀疑这是否会得到您想要的结果。在 .NET Framework 的其他地方可以创建 Zip 存档,但它是 not via GZipStream.

你可能想要ZipArchive