Udostępnij za pośrednictwem


DotNetZip now can save directly to ASP.NET Response.OutputStream

Did you ever want to zip up a file within an ASP.NET page, and then send it as a download for the requesting browser?  The DotNetZip lib works within ASP.NET, and a recent update, available in the v1.5 preview release, allows you to create a zip file and save it directly to Response.OutputStream, with no intermediate file i/o, no saving the zip file to a directory on the server, no memorystreams or byte arrays to cache the content.

The code looks like this:

 public void btnGo_Click (Object sender, EventArgs e)
{
  Response.Clear();
  String ReadmeText= "This is a zip file dynamically generated at " + System.DateTime.Now.ToString("G");
  string filename = System.IO.Path.GetFileName(ListOfFiles.SelectedItem.Text) + ".zip";
  Response.ContentType = "application/zip";
  Response.AddHeader("content-disposition", "filename=" + filename);
  
  using (ZipFile zip = new ZipFile(Response.OutputStream)) {
    // Add to the zip archive, the file selected in the dropdownlist.
    zip.AddFile(ListOfFiles.SelectedItem.Text, "files");
    // Add a boilerplate copyright file into the zip.
    zip.AddFile"\static\Copyright.txt", "");
    // The string ReadmeText becomes the content for an entry in the zip archive, with the filename "Readme.txt".
    zip.AddStringAsFile(ReadmeText, "Readme.txt", "");
    zip.Save();
  }

  Response.End();
}

This example assumes there is a DropDownList named ListOfFiles that contains a list of files. But of course you could get the list of files anywhere. And it goes without saying that you can add more than one file.

Simple, easy.

You need to get the 1.5 release of DotNetZip to use this new feature.

Comments

  • Anonymous
    June 05, 2008
    Amazing tool, just what i was looking for!

  • Anonymous
    October 09, 2008
    Thank you very much. But how to get the length of the zip stream, so I can apply it to .AddHeader("Content-Length")

  • Anonymous
    October 13, 2008
    Typically you don't explicitly set content-length in the application.  ASP.NET buffers the output and automatically appends the correct content length.  

  • Anonymous
    October 29, 2008
    Thanks for the answer. But I tried again, no length content is appended on the download dialog. The code I'm using is just copied from this page. Could you please shed some light on it?

  • Anonymous
    November 04, 2008
    I think you should try the discussion forums on www.codeplex.com/DotNetZip .