如何压缩内存流中的 PDF 和 XML 文件
How to zip PDF and XML files which are in memorystreams
我正在使用 VS2015 和 ASP.Net 开发安装在 AWS 云中的 Web 服务应用程序。
在我的一种方法中,我得到了两个文件,一个 PDF 和一个 XML。
这些文件仅作为 MemoryStream 类型的实例存在。
现在我必须将这两个 "files" 压缩到 ZIP 文件中,然后再将 zip 作为附件添加到电子邮件 (class MailMessage)。
看来我必须先将内存流保存到文件中,然后再将它们作为条目添加到 zip。
这是真的还是我有另一种可能将流作为条目添加到 zip 中?
提前致谢!
答案是否定的。
在将文件添加到 ZIP 文件的流之前无需保存文件。
我找到了使用 Nuget 包 DotNetZip 的解决方案。
这是一个如何使用它的代码示例。
在该示例中,有两个文件仅存在于 MemoryStream 对象中,而不存在于本地磁盘上。
在将流添加到 ZIP 流之前,将流的 Position 属性 重置为零很重要。
最后,我将 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);
}
我正在使用 VS2015 和 ASP.Net 开发安装在 AWS 云中的 Web 服务应用程序。
在我的一种方法中,我得到了两个文件,一个 PDF 和一个 XML。
这些文件仅作为 MemoryStream 类型的实例存在。
现在我必须将这两个 "files" 压缩到 ZIP 文件中,然后再将 zip 作为附件添加到电子邮件 (class MailMessage)。
看来我必须先将内存流保存到文件中,然后再将它们作为条目添加到 zip。
这是真的还是我有另一种可能将流作为条目添加到 zip 中?
提前致谢!
答案是否定的。 在将文件添加到 ZIP 文件的流之前无需保存文件。
我找到了使用 Nuget 包 DotNetZip 的解决方案。 这是一个如何使用它的代码示例。 在该示例中,有两个文件仅存在于 MemoryStream 对象中,而不存在于本地磁盘上。 在将流添加到 ZIP 流之前,将流的 Position 属性 重置为零很重要。 最后,我将 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);
}