In this article I will explain how to download multiple files from server on single button click by creating Zip Archive File using DotNetZip Library in ASP.Net using C# and VB.Net.
Referencing the DotNetZip Library
You will need to download the DotNetZip Library DLL using the Download Link provided below.
Download DotNetZip Or your will find the DLL in the attached sample at the end of the article.
Once you have the DLL you need to place the Ionic.Zip.Reduced.dll in the BIN Folder.
You will need to import the following Namespaces.
using System.IO;
using Ionic.Zip;
using System.Collections.Generic;
Imports System.IO
Imports Ionic.Zip
Imports System.Collections.Generic
Storage of Files on Server Directory
In my website I have created a Folder named Files which contains the following files as shown in the screenshot below.
Download multiple files as Zip Archive File in ASP.Net using C# and VB.Net
Displaying the Files stored in Folder on the Server in ASP.Net GridView
I have placed an ASP.Net GridView control on my Web Page along with a Button that will be used to download the Files.
You will notice that I have placed a CheckBox Control in the GridView, this CheckBox will allow users to select the file that wish to download.
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" EmptyDataText="No files available">
                <asp:CheckBox ID="chkSelect" runat="server" />
                <asp:Label ID="lblFilePath" runat="server" Text='<%# Eval("Value") %>' Visible="false"></asp:Label>
        <asp:BoundField DataField="Text" HeaderText="File Name" />
<br />
<asp:Button ID="btnDownload" runat="server" Text="Download" OnClick="DownloadFiles" />
The following code is used to bind the List of Files from the Server Folder or Directory to the ASP.Net GridView control.
protected void Page_Load(object sender, EventArgs e)
    if (!IsPostBack)
        string[] filePaths = Directory.GetFiles(Server.MapPath("~/Files/"));
        List<ListItem> files = new List<ListItem>();
        foreach (string filePath in filePaths)
            files.Add(new ListItem(Path.GetFileName(filePath), filePath));
        GridView1.DataSource = files;
Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
    If Not IsPostBack Then
        Dim filePaths As String() = Directory.GetFiles(Server.MapPath("~/Files/"))
        Dim files As New List(Of ListItem)()
        For Each filePath As String In filePaths
            files.Add(New ListItem(Path.GetFileName(filePath), filePath))
        GridView1.DataSource = files
    End If
End Sub
Downloading Multiple Files selected in GridView as Zip Archive File using DotNetZip
When the Download Button is clicked, first an object of the DotNetZip Library is created and a loop is executed over the GridView rows and the all the files for which the Checkbox is checked are added to the Zip object.
Finally the Zip object is downloaded as Zip file.
protected void DownloadFiles(object sender, EventArgs e)
    using (ZipFile zip = new ZipFile())
        zip.AlternateEncodingUsage = ZipOption.AsNecessary;
        foreach (GridViewRow row in GridView1.Rows)
            if ((row.FindControl("chkSelect") as CheckBox).Checked)
                string filePath = (row.FindControl("lblFilePath") as Label).Text;
                zip.AddFile(filePath, "Files");
        Response.BufferOutput = false;
        string zipName = String.Format("Zip_{0}.zip", DateTime.Now.ToString("yyyy-MMM-dd-HHmmss"));
        Response.ContentType = "application/zip";
        Response.AddHeader("content-disposition", "attachment; filename=" + zipName); 
Protected Sub DownloadFiles(sender As Object, e As EventArgs)
    Using zip As New ZipFile()
        zip.AlternateEncodingUsage = ZipOption.AsNecessary
        For Each row As GridViewRow In GridView1.Rows
            If TryCast(row.FindControl("chkSelect"), CheckBox).Checked Then
                Dim filePath As String = TryCast(row.FindControl("lblFilePath"), Label).Text
                zip.AddFile(filePath, "Files")
            End If
        Response.BufferOutput = False
        Dim zipName As String = [String].Format("Zip_{0}.zip", DateTime.Now.ToString("yyyy-MMM-dd-HHmmss"))
        Response.ContentType = "application/zip"
        Response.AddHeader("content-disposition", "attachment; filename=" + zipName)
    End Using
End Sub
Download multiple files as Zip Archive File in ASP.Net using C# and VB.Net