从 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?
这里的问题正是它所说的:您正在根据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