ZipArchive给出意外的数据结束错误

我正在尝试使用一些字节数组数据动态创建一个zip流,并通过我的MVC动作下载。

但是在Windows中打开时,下载的文件总是会出现以下损坏的错误。

在此处输入图像描述

当我尝试从7z提取时出现此错误

在此处输入图像描述

但请注意,从7z中提取的文件未损坏。

我正在使用ZipArchive ,下面是我的代码。

  private byte[] GetZippedPods(IEnumerable pods, long consignmentID) { using (var zipStream = new MemoryStream()) { //Create an archive and store the stream in memory. using (var zipArchive = new ZipArchive(zipStream, ZipArchiveMode.Create, true)) { int index = 1; foreach (var pod in pods) { var zipEntry = zipArchive.CreateEntry($"POD{consignmentID}{index++}.png", CompressionLevel.NoCompression); using (var originalFileStream = new MemoryStream(pod.ByteData)) { using (var zipEntryStream = zipEntry.Open()) { originalFileStream.CopyTo(zipEntryStream); } } } return zipStream.ToArray(); } } } public ActionResult DownloadPOD(long consignmentID) { var pods = _consignmentService.GetPODs(consignmentID); var fileBytes = GetZippedPods(pods, consignmentID); return File(fileBytes, MediaTypeNames.Application.Octet, $"PODS{consignmentID}.zip"); } 

我在这做错了什么

任何帮助都会受到高度赞赏,因为我一整天都在苦苦挣扎。

提前致谢

使用zipStream.ToArray()移动zipStream.ToArray()

您遇到问题的原因是流被缓冲。 有几种方法可以解决它:

  • 您可以将流的AutoFlush属性设置为true
  • 您可以在流上手动调用.Flush()

或者,因为它是MemoryStream并且你正在使用.ToArray() ,所以你可以简单地允许流首先被关闭/处置(我们已经通过将它移到using之外using )。

我也遇到了这个问题,我发现我的问题不是存档本身的产生,而是我在AngularJS中处理我的GET请求的方式。

这篇文章帮助我: 如何使用angular下载zip文件

关键是在我的$ http调用中添加responseType: 'arraybuffer'

 factory.serverConfigExportZIP = function () { return $http({ url: dataServiceBase + 'serverConfigExport', method: "GET", responseType: 'arraybuffer' }) };