Evonet
Evonet

Reputation: 3640

Adding multiple files to an in memory zip archive in c#

I'm trying to use the Zip Archive library in .NET 4.5 to create a .zip file in memory of a bunch of byte[] attachments:

using (var memoryStream = new MemoryStream())
{
    using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
    {
        string zipFilename = string.Format(@"c:\temp\{0} - {1}.zip",
            "test",
            System.DateTime.Now.ToString("yyyyMMddHHmm"));
        using (var fileStream = new FileStream(zipFilename, FileMode.Create))
        {
            foreach (var attachment in attachments)
            {
                ZipArchiveEntry entry = archive.CreateEntry(attachment.FileName);

                using (Stream ZipFile = entry.Open())
                {
                    byte[] data = attachment.Data;
                    ZipFile.Write(data, 0, data.Length);
                }
            }
        }

    }
}

PdfAttachment is a class with a byte[] Data and string Filename.

My problem is twofold. Once, the zip archive is empty. 2, rather than save it to a file, I'd like to use the response outputs to download the file in the users browser, which I have tried with:

Response.Clear();

Response.ClearContent();
Response.ClearHeaders();

Response.ContentType = "application/pdf";
Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}.zip; size={1}", "test.zip", memoryStream.Length));
Response.BinaryWrite(memoryStream);

Response.Flush();
Response.End();

I haven't been able to find many examples online, hence the vagueness.

Upvotes: 0

Views: 2500

Answers (1)

Richard Schneider
Richard Schneider

Reputation: 35464

The fileStream is never written to because it is not associated with the archive.

So the archive is being written to the memoryStream.

BinaryWrite only accepts a byte[] so use memoryStream.ToArray().

Also, Response.ContentType value is wrong.

Upvotes: 3

Related Questions