Professional Documents
Culture Documents
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
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.
-
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
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.
4
Bocchi Cinzia Ultimo aggiornamento: 02/04/2013