Search code examples
streamzipmemorystream

How to zip PDF and XML files which are in memorystreams


I'm working with VS2015 and ASP.Net on a webservice application which is installed in the AWS cloud.

In one of my methods i got two files, a PDF and a XML.

These files just exist as instances of type MemoryStream.

Now i have to compress these two "files" in a ZIP file before adding the zip as attachment to an E-mail (class MailMessage).

It seems that i have to save the memorystreams to files before adding them as entries to the zip.

Is ist true or do i have another possibility to add the streams as entries to the zip?

Thanks in advance!


Solution

  • The answer is no. It is not necessary to save the files before adding them to the stream for the ZIP file.

    I have found a solution with the Nuget package DotNetZip. Here is a code example how to use it. In that example there two files which only exist in MemoryStream objects, not on a local disc. It is important to reset the Position property of the streams to zero before adding them to the ZIP stream. At last i save the ZIP stream as a file in my local folder to control the results.

    //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);
    }