You are on page 1of 4

Effettuare il download di un file con PHP

Download mediante link diretto


Volendo consentire ad un utente del nostro sito di effettuare il download di un file, la prima cosa che viene in mente di fornire un link diretto. Occorre fare attenzione, per, al fatto che: i file html, pdf e immagine vengono aperti direttamente nel browser ed possibile salvarli con Salva con nome; i file php vengono processati dal server e non possibile scaricarli; per tutti gli altri file, il browser chiede di salvare, se non c' un programma associato in grado di aprirli.

Esempio
Supponiamo che in una cartella download del web server siano presenti i file: - esempio.html - esempio.jpg - esempio.pdf - esempio.doc Consideriamo la pagina html seguente:

Il cui codice :
down.html <!doctype html> <html> <head> <meta charset="UTF-8"> <title>Download</title> </head> <body> <p>Clicca sul collegamento per scaricare i file</p> <a href="esempio.html">esempio.html</a><br> <a href="esempio.jpg">esempio.jpg</a><br> <a href="esempio.pdf">esempio.pdf</a><br> <a href="esempio.doc">esempio.doc</a> </body> </html>

Se si desidera, invece, forzare il download, indipendentemente dal tipo di file, occorre agire in modo diverso, intervenendo sugli header http. Prima di proseguire, vediamo sinteticamente che cos http e come funzionano gli header.
1
Bocchi Cinzia Ultimo aggiornamento: 02/04/2013

Protocollo HTTP
Il protocollo HTTP ( Hyper Text Transfer Protocol) usato come principale sistema per la trasmissione di informazioni sul web. Esso si basa sullo scambio di messaggi. I tipi di messaggi sono due: messaggi di richiesta (HTTP request); messaggi di risposta (HTTP response). Vediamo, molto in generale, quali sono le caratteristiche di queste due tipologie di messaggi. HTTP request La richiesta una linea di testo (ASCII) divisa in 3 parti:

Request line Contiene lindicazione del metodo HTTP, lURI, che identifica la risorsa che si vuole ottenere e la versione del protocollo. Header1 Contiene alcune informazioni come il nome del server a cui si riferisce lURI (host) e il tipo di client che ha inviato la richiesta ( user agent). Body Il contenuto della richiesta.

Le modalit di invio di dati al server sono tipicamente due e dipendono da quale metodo del protocollo http si intende utilizzare: get o post. Esistono comunque anche ulteriori metodi.2 Metodo GET Quando si sceglie il metodo get, le variabili ed il relativo valore vengono fornite allo script destinatario, tramite la barra degli indirizzi del browser. NellURL della pagina di risposta potremo vedere tutti i parametri nella barra degli indirizzi (pi precisamente nella " query string"). La lista dei parametri, ciascuno nella forma nome_parametro=valore_parametro appare dopo un punto interrogativo, posto alla fine dell'URL. Ogni parametro separato da quelli adiacenti mediante il simbolo "&". Per esempio, se si inserisce come username aaa e come password bbb, la query string avr la forma seguente:

http://miosito/path/login.html?username=aaa&password=bbb

dove miosito il nome di dominio del sito, cio il nome che identifica univocamente lhost, e path il percorso interno alla document root del server che conduce al file login.html. Metodo POST Quando si sceglie il metodo post, i dati non compaiono nella query string ma sono contenuti nel messaggio inviato.

HTTP response Il messaggio di risposta una linea di testo (ASCII) divisa in 3 parti:

1
2

Status line Contiene un codice di stato, nella seguente forma:

Un elenco completo degli header http reperibile allurl: http://en.wikipedia.org/wiki/List_of_HTTP_header_fields Metodi HTTP: http://openskill.info/infobox.php?ID=357

2
Bocchi Cinzia Ultimo aggiornamento: 02/04/2013

1xx: Informational (messaggi informativi). 2xx: Success (la richiesta stata soddisfatta). 3xx: Redirection (non c' risposta immediata, ma la richiesta sensata e viene detto come ottenere la risposta). - 4xx: Client error (la richiesta non pu essere soddisfatta perch sbagliata). - 5xx: Server error (la richiesta non pu essere soddisfatta per un problema interno del server).3 Header Contiene alcune informazioni come il tipo e la versione del server ( server), il tipo di contenuto restituito (MIME4 type), per esempio text/html, per i documenti HTML, image/jpeg per unimmagine in formato jpeg. Body Il contenuto della risposta.
-

Download mediante modifica degli header


I passi necessari per forzare il download di un file sono i seguenti: 1. Modificare il file down.html in modo tale che, cliccando sul link, venga passato al server il pathname del file. 2. Creare uno script php (down.php) che recupera il pathname, fa comparire una finestra di dialogo per il download e scrive il file. Il file html modificato contiene il codice:
down.html <!doctype html> <html> <head> <meta charset="UTF-8"> <title>Download</title> </head> <body> <p>Clicca sul collegamento per scaricare i file</p> <a href="down.php?filename=esempio.html">esempio.html</a><br> <a href="down.php?filename=esempio.jpg">esempio.jpg</a><br> <a href="down.php?filename=esempio.pdf">esempio.pdf</a><br> <a href="down.php?filename=esempio.doc">esempio.doc</a> </body> </html>

Si osservi che il valore dellattributo href dellelemento <a> ha la forma:


script_php?filename=pathname script_php il nome del file php definito con il passo 2, filename il nome del parametro passato al server (viene scelto liberamente dal programmatore) e pathname il

valore del parametro passato al server (il pathname del file). Il metodo usato per inviare il parametro al server , evidentemente, GET. Il file php contiene il codice:

3 4

Per maggiori dettagli consultare http://it.wikipedia.org/wiki/Elenco_dei_codici_di_stato_HTTP Un elenco dei tipi MIME pi comuni reperibile allURL http://en.wikipedia.org/wiki/MIME_type

3
Bocchi Cinzia Ultimo aggiornamento: 02/04/2013

down.php <?php $filename=$_GET['filename']; header("Content-Disposition: attachment; filename=$filename"); readfile($filename); ?>

La prima riga di codice recupera il parametro passato con la query string e lo assegna alla variabile $filename. La seconda riga specifica lheader Content-Disposition. Questo header fa apparire una finestra di dialogo per effettuare il download del file. La sua forma generale la seguente:
Content Disposition: attachment; filename="fname.ext"

dove fname.ext deve essere sostituito dal pathname del file. Nel nostro caso, il pathname contenuto nella variabile $filename. Si osservi che, per specificare lheader stata impiegata la funzione php header(). La funzione header() non deve essere richiamata dopo che sono stati inviati dei dati al buffer duscita, per esempio tramite echo()/print() oppure con del codice HTML esterno ai tag PHP. In tale eventualit verr sollevato un Warning: Cannot modify header information - headers already sent ... Se non possibile richiamare le funzioni che manipolano gli header prima dellinvio dei dati, occorre abilitare loutput buffering, inserendo linvocazione della funzione ob_start() allinizio del file php. Labilitazione delloutput buffering fa s che tutto loutput, ad eccezione degli header, sia inviato ad un buffer interno, dal quale pu essere recuperato successivamente5. La terza riga legge il file e lo scrive nel buffer di output, mediante la funzione php readfile().

Quest'opera stata rilasciata con licenza Creative Commons Attribution-ShareAlike 3.0 Unported. Per leggere una copia della licenza visita il sito web http://creativecommons.org/licenses/by-sa/3.0/ o spedisci una lettera a Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.

Per ulteriori dettagli si veda http://www.php.net/ob_start

4
Bocchi Cinzia Ultimo aggiornamento: 02/04/2013

You might also like