11 marzo 2011

Forzare il download di file conosciuti dal browser

Autore: Filippo Amadori
loghi-a-misuraAll’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:

  1. pulire il contenuto originale di una pagina (se esiste)
  2. aggiungere un Header con il nome che avrà il file al momento del download
  3. 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)
  4. caricare il file
  5. 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:

image

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



TAG:
CATEGORIE:
 

Post Correlati

Lascia un commento