所以我已经实现了压缩文件,但现在我遇到了另一个问题,即zip文件夹包含空文件。压缩文件的大小为0字节。
这就是我压缩文件的方式
try
{
var outPutDirectory = AppDomain.CurrentDomain.BaseDirectory;
string logoimage = Path.Combine(outPutDirectory, "images\\error.png");
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.BufferOutput = false;
HttpContext.Current.Response.ContentType = "application/zip";
HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=pauls_chapel_audio.zip");
using (MemoryStream ms = new MemoryStream())
{
// create new ZIP archive within prepared MemoryStream
using (ZipArchive zip = new ZipArchive(ms, ZipArchiveMode.Create, true))
{
var demoFile = zip.CreateEntry(logoimage);
// add some files to ZIP archive
}
ms.WriteTo(HttpContext.Current.Response.OutputStream);
}
return true;
}
另一个问题是压缩文件夹的路径与图像的路径相同。所以它就像
ZippFolder/A/B/C/image...
我只需要
ZipFolder/content
答案 0 :(得分:6)
var demoFile = zip.CreateEntry(logoimage);
这会在ZIP文件中创建一个名称为logoimage
的条目(即/A/B/C/images/error.png
或完整路径)。
但是你从不写那个条目,所以它是空的。此外,如果您想拥有不同的路径,则应在其中指定:
var demoFile = zip.CreateEntry("content\\error.png");
using (StreamWriter writer = new StreamWriter(demoFile.Open()))
using (StreamReader reader = new StreamReader(logoimage))
{
writer.Write(reader.ReadToEnd());
}
或者,您也可以完全跳过StreamWriter
,直接写入流:
using (Stream stream = demoFile.Open())
using (StreamReader reader = new StreamReader(logoimage))
{
reader.BaseStream.CopyTo(stream);
}
顺便说一下。您可以先跳过要在其中编写zip文件的外部MemoryStream
,然后将该流写入OutputStream
。相反,您可以直接写入该流。只需将其传递给ZipFile
构造函数:
Stream output = HttpContext.Current.Response.OutputStream;
using (ZipArchive zip = new ZipArchive(output, ZipArchiveMode.Create, true))
{
…
}