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

时间:2016-01-08 21:49:20

标签: c# stream zip compression

我想创建一个zip文件并将其返回到浏览器,以便将zip下载到downloads-folder。

              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吗?

1 个答案:

答案 0 :(得分:4)

这里的问题正是它所说的:你正在根据gz处理它,但gz在您离开using时就被处置了。

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

File

请注意,gzip流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"); } 存档相同,因此我非常怀疑这会产生您想要的结果。 Zip存档创建在.NET框架的其他位置可用,但通过.zip

您可能需要ZipArchive