Hi ba7russ,
I have created sample code by referring the below article which full-fill your requirement. So please refer the below code.
HTML
<div>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" EmptyDataText="No files available">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:CheckBox ID="chkSelect" runat="server" />
<asp:Label ID="lblName" runat="server" Text='<%# Eval("Name")%>' Visible="true"></asp:Label>
<asp:Image ImageUrl='<%# ConvertImage(Eval("Data"))%>' ID="ImageData" Width="50Px"
Height="50px" runat="server" />
<asp:Label ID="lblFilePath" runat="server" Text='<%# FilePath(Eval("Data"))%>' Visible="false" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<br />
<asp:Button ID="btnOnDownload" runat="server" Text="Download" OnClick="OnDownload" />
</div>
C#
private string constring = ConfigurationManager.ConnectionStrings["conString"].ConnectionString;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DeleteFile();
GetData();
}
}
private void GetData()
{
SqlConnection con = new SqlConnection(constring);
SqlCommand cmd = new SqlCommand("Select TOP 5 * from tblFiles ", con);
SqlDataAdapter sda = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
sda.Fill(dt);
GridView1.DataSource = dt;
GridView1.DataBind();
}
protected void OnDownload(object sender, EventArgs e)
{
string filePath = string.Empty;
using (ZipFile zip = new ZipFile())
{
zip.AlternateEncodingUsage = ZipOption.AsNecessary;
zip.AddDirectoryByName("Files");
foreach (GridViewRow row in GridView1.Rows)
{
if ((row.FindControl("chkSelect") as CheckBox).Checked)
{
filePath = (row.FindControl("lblFilePath") as Label).Text;
zip.AddFile(filePath, "Files");
}
}
Response.Clear();
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);
zip.Save(Response.OutputStream);
Response.End();
}
}
private void DeleteFile()
{
System.IO.DirectoryInfo di = new DirectoryInfo(Server.MapPath("~/Files/"));
foreach (FileInfo file in di.GetFiles())
{
file.Delete();
}
}
public string ConvertImage(object binaryImage)
{
byte[] bytes = (byte[])(binaryImage);
string base64String = Convert.ToBase64String(bytes, 0, bytes.Length);
return "data:image/png;base64," + base64String;
}
public string FilePath(object fileData)
{
byte[] bytes = (byte[])(fileData);
string base64String = Convert.ToBase64String(bytes, 0, bytes.Length);
MemoryStream ms = new MemoryStream(bytes, 0, bytes.Length);
ms.Write(bytes, 0, bytes.Length);
System.Drawing.Image image = System.Drawing.Image.FromStream(ms, true);
string newFile = Guid.NewGuid().ToString() + ".jpeg";
string filePath = Path.Combine(Server.MapPath("~/Files/"), newFile);
image.Save(filePath, ImageFormat.Jpeg);
return filePath;
}
Vb.Net
Private constring As String = ConfigurationManager.ConnectionStrings("conString").ConnectionString
Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
If Not IsPostBack Then
DeleteFile()
GetData()
End If
End Sub
Private Sub GetData()
Dim con As New SqlConnection(constring)
Dim cmd As New SqlCommand("Select TOP 5 * from tblFiles ", con)
Dim sda As New SqlDataAdapter(cmd)
Dim dt As New DataTable()
sda.Fill(dt)
GridView1.DataSource = dt
GridView1.DataBind()
End Sub
Protected Sub OnDownload(sender As Object, e As EventArgs)
Dim filePath As String = String.Empty
Using zip As New ZipFile()
zip.AlternateEncodingUsage = ZipOption.AsNecessary
zip.AddDirectoryByName("Files")
For Each row As GridViewRow In GridView1.Rows
If TryCast(row.FindControl("chkSelect"), CheckBox).Checked Then
filePath = TryCast(row.FindControl("lblFilePath"), Label).Text
zip.AddFile(filePath, "Files")
End If
Next
Response.Clear()
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", Convert.ToString("attachment; filename=") & zipName)
zip.Save(Response.OutputStream)
Response.[End]()
End Using
End Sub
Private Sub DeleteFile()
Dim di As System.IO.DirectoryInfo = New DirectoryInfo(Server.MapPath("~/Files/"))
For Each file As FileInfo In di.GetFiles()
file.Delete()
Next
End Sub
Public Function ConvertImage(binaryImage As Object) As String
Dim bytes As Byte() = DirectCast(binaryImage, Byte())
Dim base64String As String = Convert.ToBase64String(bytes, 0, bytes.Length)
Return Convert.ToString("data:image/png;base64,") & base64String
End Function
Public Function FilePath(fileData As Object) As String
Dim bytes As Byte() = DirectCast(fileData, Byte())
Dim base64String As String = Convert.ToBase64String(bytes, 0, bytes.Length)
Dim ms As New MemoryStream(bytes, 0, bytes.Length)
ms.Write(bytes, 0, bytes.Length)
Dim image As System.Drawing.Image = System.Drawing.Image.FromStream(ms, True)
Dim newFile As String = Guid.NewGuid().ToString() + ".jpeg"
Dim filePath__1 As String = Path.Combine(Server.MapPath("~/Files/"), newFile)
image.Save(filePath__1, ImageFormat.Jpeg)
Return filePath__1
End Function
Screenshot