我试图为学校项目提供某种下载服务。概念很简单 - 从上传的文件创建一个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#的新手,所以我的代码可能非常糟糕。