为了账号安全,请及时绑定邮箱和手机立即绑定

无法打开从 System.IO.Compression 命名空间创建的 zip 文件

无法打开从 System.IO.Compression 命名空间创建的 zip 文件

翻过高山走不出你 2023-07-20 15:04:03
我正在尝试压缩不同数量的文件,以便可以向用户提供一个 zip 文件夹,而不必单击多个锚标记。我使用 asp.net core 3.1 中的 System.IO.Compression 命名空间来创建 zip 文件夹。这是我用来创建 Zip 文件夹的代码。        public IActionResult DownloadPartFiles(string[] fileLocations, string[] fileNames)        {            List<InMemoryFile> files = new List<InMemoryFile>();            for (int i = 0; i < fileNames.Length; i++)            {                InMemoryFile inMemoryFile = GetInMemoryFile(fileLocations[i], fileNames[i]).Result;                files.Add(inMemoryFile);            }            byte[] archiveFile;            using (MemoryStream archiveStream = new MemoryStream())            {                using (ZipArchive archive = new ZipArchive(archiveStream, ZipArchiveMode.Create, true))                {                    foreach (InMemoryFile file in files)                    {                        ZipArchiveEntry zipArchiveEntry = archive.CreateEntry(file.FileName, CompressionLevel.Fastest);                        using (Stream zipStream = zipArchiveEntry.Open())                        {                            zipStream.Write(file.Content, 0, file.Content.Length);                            zipStream.Close();                        }                    }                    archiveStream.Position = 0;                }                archiveFile = archiveStream.ToArray();            }            return File(archiveFile, "application/octet-stream");        }我尝试压缩的文件是远程存储的,因此我用这段代码来获取它们。InMemoryFile 是一个将文件名和文件字节组合在一起的类。使用 Ajax 调用 DownloadPartFiles 方法。我使用 javascript 获取文件的远程路径及其各自的名称,并将它们传递到 Ajax 调用中。
查看完整描述

1 回答

?
ITMISS

TA贡献1871条经验 获得超8个赞

这是我用来创建一个包含文件的 zip 文件夹的修订方法。

      public IActionResult DownloadPartFiles([FromBody] FileRequestParameters parameters)

        {

            List<InMemoryFile> files = new List<InMemoryFile>();

            for (int i = 0; i < parameters.FileNames.Length; i++)

            {

                InMemoryFile inMemoryFile = GetInMemoryFile(parameters.FileLocations[i], parameters.FileNames[i]).Result;

                files.Add(inMemoryFile);

            }

            byte[] archiveFile = null;

            using (MemoryStream archiveStream = new MemoryStream())

            {

                using (ZipArchive archive = new ZipArchive(archiveStream, ZipArchiveMode.Create, true))

                {

                    foreach (InMemoryFile file in files)

                    {

                        ZipArchiveEntry zipArchiveEntry = archive.CreateEntry(file.FileName, CompressionLevel.Optimal);

                        using (MemoryStream originalFileStream = new MemoryStream(file.Content))

                        using (Stream zipStream = zipArchiveEntry.Open())

                        {

                            originalFileStream.CopyTo(zipStream);

                        }

                    }

                }

                archiveFile = archiveStream.ToArray();

            }

            return File(archiveFile, "application/octet-stream");

        }

我仍然不知道为什么以前的方法会出现问题,所以如果有人知道未来的答案,我很想知道。


查看完整回答
反对 回复 2023-07-20
  • 1 回答
  • 0 关注
  • 176 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信