使用System.IO.Compression创建的ZipArchive已损坏

时间:2017-09-05 14:51:18

标签: c# asp.net-core asp.net-core-mvc ziparchive

我很难在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" };
            }
        }

当我运行它时,我得到了zipfile,但无法打开它。它会引发错误,说明它可能已经损坏。我调试了代码,注意到其中一个属性(length属性)抛出了invalidOperation异常。我的方法看起来与我在网上发现的大多数样本相同不知道如何解决这个问题。请帮忙。

1 个答案:

答案 0 :(得分:0)

您的问题是您在返回之前处置了内存流。删除此Public WithEvents myItem As Outlook.MailItem Private Sub Application_ItemLoad(ByVal Item As Object) If Item.Class = olMail Then Set myItem = Item End If End Sub Private Sub myItem_Open(Cancel As Boolean) Dim oAccount As Outlook.Explorer Dim oMail As MailItem Dim Recip As Outlook.Recipient Set oAccount = Application.ActiveExplorer MsgBox (oAccount.CurrentFolder.Store) If oAccount.CurrentFolder.Store = "account@outlook.com" Then MsgBox ("CC needs to be added") Set Recip = myItem.Recipients.Add("cc@cc.cc") Recip.Type = olCC Recip.Resolve Else MsgBox ("no need to add CC") End If End Sub

using

将其替换为:

using(MemoryStream stream = new MemoryStream())

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