
All’interno delle nostre applicazioni web, spesso e volentieri, è necessario eseguire il download di file che il browser tenderà ad aprire al suo interno piuttosto che lasciarli scaricare.
Per esempio, se il nostro indirizzo web punta ad un file con estensione “.pdf”, questo sarà aperto all’interno del browser piuttosto che essere scaricato, allo stesso modo, una pagina web verrà visualizzata piuttosto che essere inserita nella coda dei downloads.
Con Asp.NET possiamo modificare questa situazione in modo semplice ed efficace, utilizzando pochissime righe di codice.
Utilizzo dell’oggetto Response per forzare il download
Questo esperimento cercherà di eseguire il download di una pagina HTML senza visualizzarla all’interno del browser, quindi creiamo una pagina web a nostro piacimento e salviamola con il nome “paginaHTML.html”.
A questo punto creiamo un file per la gestione generica IHttpHandler e chiamiamolo “ForceDownloadHandler.ashx”.
Inseriamo il codice qui di seguito:
<%@ WebHandler Language="VB" Class="ForceDownloadHandler" %>
Imports System
Imports System.Web
Public Class ForceDownloadHandler : Implements IHttpHandler
Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
context.Response.Clear()
context.Response.AddHeader("Content-Disposition", "attachment; filename=pagina_scaricata.html")
context.Response.ContentType = "application/octet-stream"
context.Response.TransmitFile(context.Server.MapPath("paginaHTML.html"))
context.Response.End()
End Sub
Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
Get
Return False
End Get
End Property
End Class
Come è possibile capire dal codice, utilizzando l’oggetto Response e le sue proprietà possiamo:
-
pulire il contenuto originale di una pagina (se esiste)
-
aggiungere un Header con il nome che avrà il file al momento del download
-
Impostare il tipo di contenuto del file, nel nostro caso “application/octet-stream” indica un file binario generico (vedere la fine dell’articolo per una lista dei ContentType più comuni)
-
caricare il file
-
concludere il processo di risposta della pagina
In questo modo il nostro file di gestione generica IHttpHandler si trasforma nel file che vogliamo far caricare.
Se ora proviamo a visualizzare il nostro file di gestione generica all’interno di un browser, otterremo come risultato questa finestra di download:

Una pagina web che viene scaricata invece di essere visualizzata che ne dite?
Il metodo WriteFile dell’oggetto Response, memorizza nel buffer l’intero file caricato prima di renderlo disponibile per il download, quindi può risultare carente a livello di prestazioni nel caso di file con dimensioni più elevate.
Per ovviare al problema possiamo utilizzare il metodo TransmitFile, sempre dell’oggetto Response, il quale offre prestazioni migliori con ulteriori argomenti facoltativi, che ne aumentano la specificità.
context.Response.TransmitFile(context.Server.MapPath("paginaHTML.html"))
In questo esempio abbiamo lavorato con una pagina HTML, ma possiamo utilizzare qualsiasi tipo di file permesso dal server.
ContentType più utilizzati
'Documento PDF
Response.ContentType = "application/pdf"
'Archivio ZIP
Response.ContentType = "application/zip"
'Documento MS Word
Response.ContentType = "application/msword"
'Documento MS Excel
Response.ContentType = "application/vnd.ms-excel"
'Filmato ASF
Response.ContentType = "video/x-ms-asf"
'Filmato AVI
Response.ContentType = "video/avi"
'Filmato MPEG
Response.ContentType = "video/mpeg"
'Audio WAV
Response.ContentType = "audio/wav"
'Audio MP3
Response.ContentType = "audio/mpeg3"
'Immagine GIF
Response.ContentType = "image/gif"
'Immagine png
Response.ContentType = "image/png"
'Immagine JPG
Response.ContentType = "image/jpeg"
'Formato binario generico
Response.ContentType = "application/octet-stream"
Per scaricare degli esempi completi fate clic QUI, mentre per approfondire l’argomento potete dare una sbirciatina a questo articolo: http://msdn.microsoft.com/it-it/library/cc308648.aspx#S1