download multiple files as zip in .net

39,132

Solution 1

You need to pack files and write a result to a response. You can use SharpZipLib compression library.

Code example:

Response.AddHeader("Content-Disposition", "attachment; filename=" + compressedFileName + ".zip");
Response.ContentType = "application/zip";

using (var zipStream = new ZipOutputStream(Response.OutputStream))
{
    foreach (string filePath in filePaths)
    {
        byte[] fileBytes = System.IO.File.ReadAllBytes(filePath);

        var fileEntry = new ZipEntry(Path.GetFileName(filePath))
        {
            Size = fileBytes.Length
        };

        zipStream.PutNextEntry(fileEntry);
        zipStream.Write(fileBytes, 0, fileBytes.Length);
    }

    zipStream.Flush();
    zipStream.Close();
}

Solution 2

This is how to do it the DotNetZip way :D I vouch for DotNetZip because I have used it and it is by far the easiest compression library for C# I've come across :)

Check http://dotnetzip.codeplex.com/

http://dotnetzip.codeplex.com/wikipage?title=CS-Examples&referringTitle=Examples

Create a downloadable zip within ASP.NET. This example creates a zip dynamically within an ASP.NET postback method, then downloads that zipfile to the requesting browser through Response.OutputStream. No zip archive is ever created on disk.

public void btnGo_Click (Object sender, EventArgs e)
{
  Response.Clear();
  Response.BufferOutput= false;  // for large files
  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()) 
  {
    zip.AddFile(ListOfFiles.SelectedItem.Text, "files");
    zip.AddEntry("Readme.txt", "", ReadmeText);
    zip.Save(Response.OutputStream);
  }
  Response.Close();
}

Solution 3

Create a ZIP file on the fly using http://www.icsharpcode.net/opensource/sharpziplib/.

Share:
39,132
deepu
Author by

deepu

software/web .net developer

Updated on July 05, 2022

Comments

  • deepu
    deepu almost 2 years

    I have a program which needs to download multiple files at once. I can download a single file by using this single file download, but it doesn't work for multiple.

    How can one download multiple files at once in such as as zip file?

  • Fedearne
    Fedearne over 13 years
    @deepu you will probably have to use rar.exe create a rar-file.
  • Pieter van Ginkel
    Pieter van Ginkel over 13 years
    This threads has some information concerning RAR: stackoverflow.com/questions/1025863/….
  • pearcewg
    pearcewg over 12 years
    That is great...well deserving of an upvote. Do you know if there is any real time way to know the compressed size? I want to be able to tell my users the size of what they will download if compressed.
  • bniwredyc
    bniwredyc over 12 years
    @pearcewg, I think in this case solution depends on your requirement. If you know what will be a content of archives you can compress files before page generation and just show archives' size. If content of the archives may vary then it's nontrivial task. My thoughts are: 1. put information about compressed files size in database 2. show approximate size of compressed files according to statistics of compression.
  • Sagar Rawal
    Sagar Rawal over 10 years
    Hello.. Thanks for this Nice Reply.. But i want to know that whether i can change the name of the file before adding into zip(before zip.AddFile command). I am talking about the file which will going to be added into the ZIP not the file name of the zip file.
  • Roxy'Pro
    Roxy'Pro over 7 years
    @bniwredyc What is foreach (string filePath in filePaths), I mean where did you fill list called filePaths, could you explain this code little bit?