【发布时间】:2018-02-13 22:09:45
【问题描述】:
我很难在 Asp.net 核心 MVC 上成功创建 ZipArchive。我有一个用有效数据生成的 excel 文件,我需要存档。这是我到目前为止所做的
public FileResult ExportGoodsReceiptData()
{
var records = _salesService.GetAllReceipts();
var lineRecords = _salesService.GetAllReceiptLines();
var result = _salesService.ExportGoodsReceiptData(records);
var lineResult = _salesService.ExportGoodsReceiptLineData(lineRecords);
byte[] resultArr = StreamToByteArray(result);
byte[] lineResultArr = StreamToByteArray(lineResult);
using(MemoryStream stream = new MemoryStream())
{
using (var archive = new ZipArchive(stream, ZipArchiveMode.Create, true))
{
var zipArchiveEntry = archive.CreateEntry("GoodsReceipts.csv", CompressionLevel.Fastest);
using (var zipStream = zipArchiveEntry.Open())
using (var resultCom = new MemoryStream(resultArr))
{
resultCom.CopyTo(zipStream);
}
}
return new FileStreamResult(stream, "application/zip") { FileDownloadName = "GoodsReceiptsArchive.zip" };
}
}
当我运行它时,我得到了 zip 文件,但无法打开它。它抛出错误,指出它可能已损坏。我调试了代码,发现其中一个属性(length 属性)引发了 invalidOperation 异常。我的方法看起来与我在网上找到的大多数示例相同。不知道还有什么办法解决这个问题。请帮忙。
【问题讨论】:
-
在您的 zipArchiveEntry 变量上调用 .Dispose 以关闭条目。
-
@JayBuckman 对象中不存在 Dispose() 方法。
-
这里是一个例子 stackoverflow.com/questions/29907291/… 尝试从 MemoryStream 流中删除 using
-
您在返回内存流时将其处理掉。
FileStreamResult实际上不包含任何数据,因为流已被释放。 -
@JayBuckman 仍然没有工作。虽然使用 using 指令,但我认为不需要 Dispose() 调用
标签: c# asp.net-core asp.net-core-mvc ziparchive