L’invio del file avviene in modo analogo all’invio di dati classico che abbiamo già visto con i metodi POST e GET.
Bisogna sapere che l’invio di un qualsiasi dato corrisponde ad una determinata richiesta HTTP, ognuna per gestire un tipo di dato diverso, il che significa che se abbiamo una normale pagina HTML con all’interno 3 immagini, avremo 4 richieste HTTP da parte del browser come segue :
Richieste HTTP : Content-Type: text/html Content-Type: image/jpeg Content-Type: image/jpeg Content-Type: image/jpeg
Per questo motivo quando dobbiamo inviare un file sono necessari alcuni accorgimenti in più rispetto ad un normale dato, a partire da due principali modifiche nella form HTML di invio :
- enctype – E’ obbligatorio specificare questo attributo nella form HTML assegnandolo al valore “multipart/form-data“
- file – E’ necessario inserire un campo input del tipo file
Form HTML per l’invio di file
Vediamo la pagina HTML che si occuperà dell’invio del file :
<!-- invio_file.html --> <html> <head> <title>Upload di file</title> </head> <body> <form enctype="multipart/form-data" action="upload.php" method="post"> <input type="file" name="immagine" /> <br /> <input type="submit" value="Invia file" /> </form> </body> </html>
Come possiamo vedere nella pagina d’esempio soprastante, il codice è molto simile a quello delle form viste nei capitoli precedenti, con la presenza però di enctype e utilizzando file come tipo di input, che sarà trasformato dal browser in un campo vuoto con un bottone la cui etichetta è solitamente “Sfoglia”, ma che viene automaticamente sostituita a seconda della lingua del browser senza bisogno di un nostro intervento.
Il file inviato sarà poi accessibile alla pagina inviata tramite l’array globale $_FILES[] con una lista di elementi predefinita :
- $_FILES["name"] – Il nome del file inviato (es. “foto1.jpg”)
- $_FILES["type"] – Il tipo del file inviato in formato MIME (es. “image/jpeg”)
- $_FILES["tmp_name"] – Il nome del file temporaneo che risiede sul server (es. “/tmp/php8K45x”)
Una volta inviato il file, questo sarà memorizzato in una cartella temporanea del server, e sarà cancellato automaticamente a fine richiesta. Se quindi non gestite il file prima della fine dello script, perderete il file inviato. - $_FILES["error"] – Contiene un codice di errore corrispondente a un evento verificatosi durante l’invio del file
- $_FILES["size"] – La dimensione in byte del file inviato
PHP ci mette a disposizione molte funzioni per gestire il file inviato, le due che ci torneranno più utili sono :
- is_uploaded_file() – Controlla se il file è stato effettivamente inviato
- move_uploaded_file() – Sposta il file inviato nella cartella specificata
E’ essenziale sapere inoltre i tipi di errore che possiamo gestire per poter creare uno script funzionale.
Come abbiamo visto prima, il codice di errore viene reso accessibile attraverso l’array globale $_FILES[] e il suo attributo “error“, che conterrà un numero intero corrispondente all’evento verificato (Lista completa dei messaggi di errore).
Torniamo ora alla form HTML dell’esempio, che invierà il file (name=”immagine”) alla pagina upload.php utilizzando il metodo POST.
upload.php
Prima di costruire uno script più robusto e flessibile, vediamo uno script leggero che riceverà il file, lo sposterà in una cartella chiamata “uploads” e mostrerà infine l’immagine appena inviata :
<?php $immagine = $_FILES["immagine"]; move_uploaded_file($immagine["tmp_name"], "C:/Appserv/www/test/uploads/" . $immagine["name"]); ?> <img src="<?= "uploads/" . $immagine["name"] ?>" />
Ho assegnato l’elemento di $_FILES[] ad un’altra variabile solo per comodità, sono infatti equivalenti le due echo che seguono :
<?php $immagine = $_FILES["immagine"]; echo "Il nome del file è inviato è " . $immagine["name"]; echo "Il nome del file è inviato è " . $_FILES["immagine"]["name"]; ?>
Lo script mostrato è fin troppo semplice e soggetto a molte complicazioni, non effettua infatti nessun controllo sulla dimensione nè sul tipo del file inviato, avremmo quindi potuto inviare un file di testo che lo script avrebbe comunque tentato di mostrarlo attraverso il tag html “img“.
Nel prossimo capitolo vedremo invece un esempio più funzionale e robusto con la programmazione orientata agli oggetti.
Versione originale dell’aticolo
Lezione Precedente -> Guida Php – Gestione avanzata delle sessioni
Lezione Successiva -> Guida Php – Classi per l’upload dei file
