用DotNetZip压缩文件,但打开后出现损坏的情况。

4

我在控制器中从字节数组创建了一个zip文件,并将其作为文件结果返回。当我下载zip文件并提取文件时,它是损坏的。我是这样做的:

byte[] fileBytes =array
MemoryStream fileStream = new MemoryStream(fileBytes);
MemoryStream outputStream = new MemoryStream();
fileStream.Seek(0, SeekOrigin.Begin);

using (ZipFile zipFile = new ZipFile())
{
    zipFile.AddEntry(returnFileName, fileStream);
    zipFile.Save(outputStream);
}

outputStream.Position = 0;

FileStreamResult fileResult = new FileStreamResult(outputStream, System.Net.Mime.MediaTypeNames.Application.Zip);
fileResult.FileDownloadName = returnFileName + ".zip";

return fileResult;

...代码中在哪里将xml文件放入字节数组的部分?这可能是出错的地方。请将其包含在您的问题中。 - mortb
这是一个zip文件,我用记事本打开它,里面有pk。我可以正确地解压缩文件。但是解压后的文件内容看起来像我上面放的那个东西,而不是原始的xml文件。看起来像是在解压缩后(我使用的是Windows),看起来像原始的zip文件或类似的东西。 - user1957868
我是说变量fileBytes的内容可能是错误的... - mortb
文件字节的内容是正确的,因为有两个下载选项,压缩或不压缩文件。如果我下载未压缩的文件,文件看起来就是正确的。我的意思是另一个选项返回的是 File(fileBytes, "text/html", returnFileName);。这是正确的,所以文件字节是没问题的。 - user1957868
抱歉,我不知道为什么你会遇到错误... :( - mortb
显示剩余6条评论
2个回答

4
您可能不幸遇到了DotNetZip中的一个已知问题。例如,文件大小会影响某些问题(https://dotnetzip.codeplex.com/workitem/14087)。
不幸的是,DotNetZip存在一些关键问题,而该项目似乎已不再得到积极维护。更好的替代方案是使用SharpZipLib(如果您遵守其基于GPL的许可协议)或者.NET zlib端口之一。
如果您使用的是.NET 4.5,则可以使用System.IO.Compression命名空间中的内置类。以下示例可以在ZipArchive类的文档中找到:
using System;
using System.IO;
using System.IO.Compression;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var zipToOpen = 
                new FileStream(@"c:\tmp\release.zip", FileMode.Open))
            {
                using (var archive = 
                     new ZipArchive(zipToOpen, ZipArchiveMode.Update))
                {
                    var readmeEntry = archive.CreateEntry("Readme.txt");
                    using (var writer = new StreamWriter(readmeEntry.Open()))
                    {
                            writer.WriteLine("Information about this package.");
                            writer.WriteLine("========================");
                    }
                }
            }
        }
    }
}

我没有使用4.5版本,也无法迁移。但无论如何,我不认为这是我的问题,因为这个错误只会发生在具体的文件上。但我遇到的问题是所有文件都有这个问题。 - user1957868
System.IO.Compression 太棒了! - John Babb
看起来这个问题已经在“DotNetZip”分支中得到了修复,可以通过Nuget获取:https://github.com/haf/DotNetZip.Semverd/pull/24 - Iain

0
public class HomeController : Controller
{
    public FileResult Index()
    {
        FileStreamResult fileResult = new FileStreamResult(GetZippedStream(), System.Net.Mime.MediaTypeNames.Application.Zip);
        fileResult.FileDownloadName = "result" + ".zip";
        return fileResult;
    }

    private static Stream GetZippedStream()
    {
        byte[] fileBytes = Encoding.ASCII.GetBytes("abc");
        string returnFileName = "something";

        MemoryStream fileStream = new MemoryStream(fileBytes);
        MemoryStream resultStream = new MemoryStream();

        using (ZipFile zipFile = new ZipFile())
        {
            zipFile.AddEntry(returnFileName, fileStream);
            zipFile.Save(resultStream);
        }

        resultStream.Position = 0;
        return resultStream;
    }
}

在这个过程中,我创建了一个我不想要的文件,而且结果还是损坏的。你试过下载后打开文件吗?另外,我的返回类型必须是FileStreamResult,因为它是一个控制器,所以我必须像这样做:FileStreamResult fileResult = new FileStreamResult(fileResultStream, System.Net.Mime.MediaTypeNames.Application.Zip); - user1957868
是的,我可以打开文件。内容没有损坏。我已经编辑了我的答案,包括控制器代码。 - shamp00
fileBytes = Encoding.ASCII.GetBytes("abcdefghi"); 如果我使用这个覆盖fileBytes,我可以得到正确的结果。但是对于我的文件不起作用。 - user1957868
那么问题可能与您的字节数组编码有关。您能否使用 Encoding.Convert(Encoding.GetEncoding("iso-8859-1"), Encoding.UTF8, bytes); 将其转换为字符串?这个字符串看起来正确吗? - shamp00
我尝试过了,但是当我打开文件时仍然看起来不对。 - user1957868
你能否发布一个示例XML文件,包括你用来将其转换为字节数组的代码? - shamp00

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接