我想创建一个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吗?
答案 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