动态创建ZIP会生成损坏的文件

时间:2015-06-24 00:07:15

标签: c# asp.net zip

我试图为学校项目提供某种下载服务。概念很简单 - 从上传的文件创建一个zip文件。第一个问题是学校服务器上的asp.net被配置为应用程序无法写入任何文件,所以我将它们存储在数据库中。然后我需要从这些创建zip。再一次,没有写在磁盘上。我设法让它发挥作用。差不多 - 代码会生成损坏的文件。

有趣的是,评论部分生成工作文件。区别在于第11和第12字节。它似乎是校验和或文件长度,但在损坏的文件中每次都不同。

这个问题的解决方案是使用DotNetZip lib,但我认为这只是一行或类似问题,因为只有2个字节错误。(字节12-15对应于修改日期和时间,因此它们必须不同。我不确定为什么我的编辑器没有告诉我最后有大量数据缺失。)

损坏的文件最后缺少签名。它可能是由错误的内容长度标题或zip生成引起的。

using (var memoryStream = new MemoryStream())
{
    // var filepath = context.Server.MapPath("files\\") + Guid.NewGuid() + ".zip";
    // var zip = ZipFile.Open(filepath, ZipArchiveMode.Create);
    var mzip = new ZipArchive(memoryStream, ZipArchiveMode.Create);
    while (reader.Read())
    {
        //zip.CreateEntryFromFile((string) reader["path"], (string) reader["name"], CompressionLevel.Optimal);
        var contents = (byte[]) reader["contents"];
        var stream = mzip.CreateEntry((string) reader["name"], CompressionLevel.Optimal).Open();
        using (var fs = new MemoryStream(contents))
        {
            fs.CopyTo(stream);
        }
        stream.Close();
    }
    //  zip.Dispose();

    Response.Clear();
    Response.ContentType = "application/ocetet-stream";
    Response.HeaderEncoding = Response.ContentEncoding;

    Response.AppendHeader("content-disposition", "attachment; filename=\"" + gname + ".zip\"");
    //Response.AppendHeader("content-length", new FileInfo(filepath).Length.ToString());
    Response.AppendHeader("content-length", memoryStream.Length.ToString());

    // Response.TransmitFile(filepath);
    Response.BinaryWrite(memoryStream.ToArray());
    Response.Flush();
}

另外 - 我是C#的新手,所以我的代码可能非常糟糕。

0 个答案:

没有答案