Introduction
In this article I explain how to bind files in a GridView and how to download selected files in zip format.
Requirements
The requirements are:
- Dll Ionic.Zip.dll
- The following namespace:
using System;
using System.Collections.Generic;
using System.IO;
using System.Web.UI.WebControls;
using Ionic.Zip;
Add the Ionic.Zip.dll to your bin folder of the application then add the namespaces above.
Code .aspx :
I have some files in my application, file1.txt and file2.doc. I bind these files in the GridView. But before binding to the GridView I design my page. Use the following code to understand what I have done :
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Download in zip format</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<br />
<asp:Label ID="lbl_txt" runat="server" Font-Bold="true" ForeColor="Red" />
</div>
<asp:GridView ID="gridview1" CellPadding="5" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:CheckBox ID="chk_Select" runat="server" />
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="Text" HeaderText="FileName" />
</Columns>
<HeaderStyle BackColor="white" Font-Bold="true" ForeColor="White" />
</asp:GridView>
<asp:Button ID="btn_Download" Text="Download " runat="server" OnClick="btnDownload_Click" />
</form>
</body>
</html>
Here you can see I have taken a GridView with a checkbox and a button with the text "Download".
Code.cs :
Bind files in GridView:
protected void BindGridview()
{
string[] files_Path = Directory.GetFiles(Server.MapPath("~/files/"));
List<ListItem> files = new List<ListItem>();
foreach (string path in files_Path)
{
files.Add(new ListItem(Path.GetFileName(path)));
}
gridview1.DataSource = files;
gridview1.DataBind();
}
Call this function on pageload :
if (!IsPostBack)
{
BindGridview();
}
}
Now, when you save all these and view the page in a browser you will see all files in the GridView.
Now write the following code for the Download button click:
using (ZipFile zip = new ZipFile())
{
foreach (GridViewRow gr in gridview1.Rows)
{
CheckBox chk = (CheckBox)gr.FindControl("chkSelect");
if (chk.Checked)
{
string fileName = gr.Cells[1].Text;
string filePath = Server.MapPath("~/files/" + fileName);
zip.AddFile(filePath, "files");
}
}
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment; filename=DownloadedFile.zip");
Response.ContentType = "application/zip";
zip.Save(Response.OutputStream);
Response.End();
}
When you write this code you are done with the code to download selected files in zipformat. Just save all again and view the page in the browser; it will work fine.