.NET

How to download MemoryStream as a file in zip

Using the SharpZipLib it’s possible to zip and unzip files. This can be a good solution when file size matters. Downloading files that are ziped can save many bandwidth. In this case a object is serialized to XML and put into a ZipOutputStream which belongs to SharpZipLib.

public static byte[] RetreiveBytes(IEnumerable<int> Ids)
{
  MemoryStream stream = new MemoryStream();
  ZipOutputStream zipStream = new ZipOutputStream(stream);
  zipStream.SetLevel(3);

  foreach (int Id in Ids)
  {
    Export export = DaoWrapper.GetExportObject(Id);                
    MemoryStream memoryStream = new MemoryStream();
    using (XmlTextWriter xmlTextWriter = 
             new XmlTextWriter(memoryStream, Encoding.UTF8))
    {
       XmlSerializer xmlSerializer = new XmlSerializer(export.GetType());
       xmlSerializer.Serialize(xmlTextWriter, trigger);
       // Write stream into a memorystream
       memoryStream = (MemoryStream) xmlTextWriter.BaseStream; 
       memoryStream.Seek(0, SeekOrigin.Begin);     
                    
       ZipEntry newEntry = new ZipEntry(export.FileName)
                                 {DateTime = DateTime.Now};
       zipStream.PutNextEntry(newEntry);

       StreamUtils.Copy(memoryStream, zipStream, new byte[4096]);
       zipStream.CloseEntry();
    }
  }
  zipStream.IsStreamOwner = false;
  zipStream.Close();
  stream.Seek(0, SeekOrigin.Begin);

  return stream.ToArray();
}

After that it’s a piece of cake to get everything up and running. Put this piece of code in a ASP.NET page and have a download available.

//Convert the memorystream to an array of bytes.
byte[] byteArray = RetreiveBytes();
// Clear all content output from the buffer stream
Response.Clear();
// for the browser's download dialog
Response.AddHeader("Content-Disposition", 
                   "attachment; filename=export.zip");
// Add a HTTP header to the output stream that contains the 
Response.AddHeader("Content-Length",
                   byteArray.Length.ToString());
// Set the HTTP MIME type of the output stream
Response.ContentType = "application/zip";
// Write the data out to the client.
Response.BinaryWrite(byteArray);
Share this