如何压缩内存流中的PDF和XML文件

时间:2018-04-11 08:42:50

标签: stream zip memorystream

我在安装在AWS云中的Web服务应用程序上使用VS2015和ASP.Net。

在我的一个方法中,我有两个文件,一个PDF和一个XML。

这些文件只是作为MemoryStream类型的实例存在。

现在我必须压缩这两个"文件"在将zip作为附件添加到电子邮件(类MailMessage)之前的ZIP文件中。

似乎我必须先将内存流保存到文件中,然后再将它们作为条目添加到zip中。

是真的还是我还有另一种可能性将流作为条目添加到zip?

提前致谢!

1 个答案:

答案 0 :(得分:0)

答案是否定的。 在将文件添加到ZIP文件的流之前,不必保存文件。

我找到了Nuget包DotNetZip的解决方案。 这是一个如何使用它的代码示例。 在该示例中,有两个文件仅存在于MemoryStream对象中,而不存在于本地磁盘上。 在将流的Position属性添加到ZIP流之前,将其重置为零非常重要。 最后,我将ZIP流保存为本地文件夹中的文件以控制结果。

//DotNetZip from Nuget
//http://shahvaibhav.com/create-zip-file-in-memory-using-dotnetzip/
string zipFileName = System.IO.Path.GetFileNameWithoutExtension(xmlFileName) + ".zip";
var zipMemStream = new MemoryStream();
zipMemStream.Position = 0;
using (Ionic.Zip.ZipFile zip = new Ionic.Zip.ZipFile())
{
    textFileStream.Position = 0;
    zip.AddEntry(System.IO.Path.GetFileNameWithoutExtension(xmlFileName) + ".txt", textFileStream);
    xmlFileStream.Position = 0;
    zip.AddEntry(xmlFileName, xmlFileStream);
    zip.Save(zipMemStream);
    // Try to save the ZIP-Stream as a ZIP file. And suddenly: It works!
    var zipFs = new FileStream(zipFileName, FileMode.Create);
    zipMemStream.Position = 0;
    zipMemStream.CopyTo(zipFs);
    zipMemStream.WriteTo(zipFs);
}