In questo articolo vedremo come realizzare una semplice applicazione di tipo Asp.Net 4.6 tramite Visual Studio 2015, che permette di effettuare il download di un file compresso, nel quale sono presenti dei file di testo.
Una tecnica che può essere utilizzata in quelle applicazioni in cui c’è bisogno di far scaricare più file contemporaneamente ma in un unico ZIP.
Creazione del progetto
Si crea un nuovo progetto di tipo Asp.Net 4.6 utilizzando il linguaggio di proprio interesse e l’ambiente di sviluppo Visual Studio 2015.
Dopo aver creato il progetto, si creano nella cartella “App_Data” tre file di testo, denominati “file1.txt, file2.txt, e file3.txt”. Aggiungiamo un riferimento alla namespace System.IO.Compression e System.IO.Compression.FileSystem
Ora non ci resta che scrivere il codice per la visualizzazione dei dati che saranno presenti in un controllo gridview e la funzionalità di download.
Stesura di codice
Nella pagina Asp.net inseriamo i controlli asp.net per la gestione front office e script per la verifica dei dati.
Ma iniziamo con il tag style, per la gestione della visibilità delle colonne.
Qui di seguito si riporta il frammento di codice per nascondere la colonna del gridiview.
<style type="text/css">
.NascondiColonna {
display: none;
}
</style>
In questo modo avremmo la colonna, quella con le indicazioni del percorso e nome del file nascosta.
Ora dobbiamo scrivere il codice Javascript, che permette di verificare se è stato selezionato o no un record o meglio riga della griglia.
Qui di seguito tale frammento di codice.
<script type="text/javascript">
function VerificaCheck(sender, args) {
var gridView = document.getElementById("<%=gdvFile.ClientID %>");
var checkBoxes = gridView.getElementsByTagName("input");
for (var i = 0; i < checkBoxes.length; i++) {
if (checkBoxes[i].type == "checkbox" && checkBoxes[i].checked) {
return true;
}
}
alert('Selezionare un record.');
return false;
}
</script>
Ora inseriamo nella pagina Aspx, il controllo GridiView con le due colonne ed un pulsante per il download dei file. Da notare che il controllo GridView avrà un checkbox per selezionare i file da scaricare.
<asp:GridView ID="gdvFile" runat="server" AutoGenerateColumns="false" EmptyDataText="Non sono presenti file">
<Columns>
<asp:TemplateField HeaderText="Seleziona">
<ItemTemplate>
<asp:CheckBox ID="chkSeleziona" runat="server" />
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="Text" HeaderText="File" />
<asp:BoundField DataField="Value" ItemStyle-CssClass="NascondiColonna" HeaderStyle-CssClass="NascondiColonna" />
</Columns>
</asp:GridView>
<br />
<asp:Button ID="btnDownload" runat="server" Text="Download" OnClick="btnDownload_Click" OnClientClick="return VerificaCheck()" />
Qui di seguito il codice completo della pagina Aspx.
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<style type="text/css">
.NascondiColonna {
display: none;
}
</style>
<script type="text/javascript">
function VerificaCheck(sender, args) {
var gridView = document.getElementById("<%=gdvFile.ClientID %>");
var checkBoxes = gridView.getElementsByTagName("input");
for (var i = 0; i < checkBoxes.length; i++) {
if (checkBoxes[i].type == "checkbox" && checkBoxes[i].checked) {
return true;
}
}
alert('Selezionare un record.');
return false;
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="gdvFile" runat="server" AutoGenerateColumns="false" EmptyDataText="Non sono presenti file">
<Columns>
<asp:TemplateField HeaderText="Seleziona">
<ItemTemplate>
<asp:CheckBox ID="chkSeleziona" runat="server" />
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="Text" HeaderText="File" />
<asp:BoundField DataField="Value" ItemStyle-CssClass="NascondiColonna" HeaderStyle-CssClass="NascondiColonna" />
</Columns>
</asp:GridView>
<br />
<asp:Button ID="btnDownload" runat="server" Text="Download" OnClick="btnDownload_Click" OnClientClick="return VerificaCheck()" />
</div>
</form>
</body>
</html>
Ora passiamo in visualizzazione codice.
Aggiungiamo lo spazio dei nomi per le classi che permetteranno la comprensione dei file.
Qui di seguito il frammento di codice per il linguaggio VB.Net e C#
VB.Net
Imports System.IO
Imports System.IO.Compression
C#
using System.IO;
using System.IO.Compression;
Nell’evento load, scriviamo il codice che permette di visualizzare nel controllo Gridview i nomi dei file presenti nella cartella App_data.
VB.Net
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
Dim filePaths As String() = Directory.GetFiles(Server.MapPath("~/App_Data/"))
Dim files As New List(Of ListItem)()
For Each filePath As String In filePaths
files.Add(New ListItem(Path.GetFileName(filePath), filePath))
Next
gdvFile.DataSource = files
gdvFile.DataBind()
End If
End Sub
C#
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
string[] filePaths = Directory.GetFiles(Server.MapPath("~/App_Data/"));
List<ListItem> files = new List<ListItem>();
foreach (string filePath in filePaths)
{
files.Add(new ListItem(Path.GetFileName(filePath), filePath));
}
gdvFile.DataSource = files;
gdvFile.DataBind();
}
}
Dobbiamo scrivere la funzione, che permette di effettuare la comprensione dei file che abbiamo selezionato nel controllo GridView.
Tramite le classi ZipFile e ZipArchiveEntry, andremo a comprimere i file e creare un file compresso di tipo “.gz” o “Zip.”
Qui di seguito si riporta il frammento di codice delle suddette operazioni, nel linguaggio VB.Net e C#.
VB.Net
Private Sub ComprimiFile(ByVal filesDaComprimere As List(Of String), ByVal PercorsoNomeFileZip As String)
Dim FileStreamCompresso As FileStream = File.Create(PercorsoNomeFileZip)
Using FileZipArchive As ZipArchive = New ZipArchive(FileStreamCompresso, ZipArchiveMode.Update)
For Each Nomefile As String In filesDaComprimere
Dim fileInformazioni As FileInfo = New FileInfo(Nomefile)
Dim FileZipEntry As ZipArchiveEntry = FileZipArchive.CreateEntryFromFile(Nomefile, fileInformazioni.Name)
Next
End Using
End Sub
C#
private void ComprimiFile(List<string> filesDaComprimere, string PercorsoNomeFileZip)
{
using (FileStream FileStreamCompresso = File.Create(PercorsoNomeFileZip))
{
using (ZipArchive FileZipArchive = new ZipArchive(FileStreamCompresso, ZipArchiveMode.Update))
{
foreach (string Nomefile in filesDaComprimere)
{
FileInfo fileInformazioni = new FileInfo(Nomefile);
ZipArchiveEntry FileZipEntry = FileZipArchive.CreateEntryFromFile(Nomefile, fileInformazioni.Name);
}
}
}
}
Nell’evento click del pulsante, scriviamo il codice che permette di comprimere i file selezionati, ed effettuare il file compresso creato tramite la precedente funzione.
Si riporta il frammento di codice.
VB.Net
Protected Sub btnDownload_Click(sender As Object, e As EventArgs)
Dim fileCompressi As New List(Of String)()
For Each gdvRiga As GridViewRow In gdvFile.Rows
Dim chkBoxSelezionato As New CheckBox()
chkBoxSelezionato = DirectCast(gdvRiga.FindControl("chkSeleziona"), CheckBox)
If chkBoxSelezionato IsNot Nothing AndAlso chkBoxSelezionato.Checked = True Then
fileCompressi.Add(gdvRiga.Cells(2).Text)
End If
Next
Dim PercorsoNomeFileZip As String = HttpContext.Current.Server.MapPath("~/App_Data/") + "FileCompresso" + ".gz"
ComprimiFile(fileCompressi, PercorsoNomeFileZip)
HttpContext.Current.Response.ContentType = "application/zip"
HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment; filename=FileCompresso.gz")
HttpContext.Current.Response.AddHeader("TempFileName", PercorsoNomeFileZip)
HttpContext.Current.Response.WriteFile(PercorsoNomeFileZip)
HttpContext.Current.ApplicationInstance.CompleteRequest()
End Sub
C#
protected void btnDownload_Click(object sender, EventArgs e)
{
List<string> fileCompressi = new List<string>();
foreach (GridViewRow gdvRiga in gdvFile.Rows)
{
CheckBox chkBoxSelezionato = new CheckBox();
chkBoxSelezionato = (CheckBox)gdvRiga.FindControl("chkSeleziona");
if (chkBoxSelezionato != null && chkBoxSelezionato.Checked == true)
{
fileCompressi.Add(gdvRiga.Cells[2].Text);
}
}
string PercorsoNomeFileZip = HttpContext.Current.Server.MapPath("~/App_Data/") + "FileCompresso" + ".gz";
ComprimiFile(fileCompressi, PercorsoNomeFileZip);
HttpContext.Current.Response.ContentType = "application/zip";
HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment; filename=FileCompresso.gz");
HttpContext.Current.Response.AddHeader("TempFileName", PercorsoNomeFileZip);
HttpContext.Current.Response.WriteFile(PercorsoNomeFileZip);
HttpContext.Current.ApplicationInstance.CompleteRequest();
}
Conclusioni
L’articolo ha voluto illustrare una tecnica per effettuare il download dei file in un solo file che è appunto compresso.
Tecnica che può essere effettuate, in quei contesti in cui si effettuano report o generazione di dati che poi andranno scaricati agli utenti.