【问题标题】:ZipArchive Created with System.IO.Compression is Damaged使用 System.IO.Compression 创建的 ZipArchive 已损坏
【发布时间】: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


【解决方案1】:

您的问题是您在返回之前处理了您的内存流。删除这个using

using(MemoryStream stream = new MemoryStream())

替换为:

var stream = new MemoryStream();

Asp.Net MVC 会自动为您处理流。

【讨论】:

  • 我按照之前的建议尝试过,但它仍然给我一个损坏的 zip 文件。
  • 不过,您确实需要进行此更改。
  • 我当前的代码有变化。我还没有对这个问题进行更新。
猜你喜欢
  • 2021-04-08
  • 1970-01-01
  • 2017-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多