5 Mar 2011 17 commenti
Php è in grado di ricevere files da un form di una pagina Web e dispone una serie di funzioni e della variabile $_FILES grazie alle quali possiamo gestire le operazioni di upload e manipolazione dei file.
Anzitutto iniziamo dalla costruzione del form.
Ci sono due cose su cui occorre prestare attenzione: nel tag <form> occorre indicare l'istruzione enctype="multipart/form-data" e l'input il type="file".
Pertanto un form per eseguire l'upload di un file avrà la seguente strutture di base:
<form action="" method="post" enctype="multipart/form-data"> <input type="file" name="upload"> <input type="submit" name="up" value="Upload file"> </form>
Dopo aver selezionato il file e premuto il tasto 'Upload file' questo verrà caricato nella memoria temporanea del server.
L'analisi delle caratteristiche del file potrà essere effettuato grazia all'array globale $_FILES.
L'array $_FILE avrà la seguente struttura:
- $_FILES["upload"]["name"]: nome del file caricato;
- $_FILES["upload"]["type"]: tipo di file caricato (in formato MIME type);
- $_FILES["upload"]["size"]: dimensione del file caricato;
- $_FILES["upload"]["tmp_name"]: percorso e il nome del file temporaneo sul server;
- $_FILES["upload"]["error"]: un codice numerico compreso fra 0 e 8 indicante il tipo di errore che si è verificato, pari a 0 in assenza di errore.
Infine analizziamo due funzioni native che consentono di gestire la procedura di upload: is_uploaded_file() e move_uploaded_file()
La funzione is_uploaded_file() verifica che il file sia stato caricato nella cartella temporanea. Essa prende come parametro il percorso e il nome del file temporaneo sul server, cioè ciò che si ottiene da $_FILES["upload"]["tmp_name"].
Restituisce un valore boleano, TRUE se il file è stato caricato; nel caso restituisce FALSE genera un errore di tipo warning.
La funzione move_uploaded_file() è la funzione che realizza concretamente l'upload in quanto sposta il file caricato dalla cartella temporanea alla cartella che noi desideriamo.
Esso prende due parametri: il primo è il percorso e il nome del file temporaneo sul server, cioè $_FILES["upload"]["tmp_name"]; il secondo è il percorso alla cartella in cui desideriamo caricare il file comprensivo del nome che desideriamo dare al file (uguale o diverso a quello originale).
La funzione restituisce un valore boleano, TRUE in caso di successo; nel caso restituisce FALSE genera un errore di tipo warning.
A questo punto abbiamo tutto ciò che ci occorre per effettuare l'upload di un file. Riportiamo uno script di esempio:
<?php // settiamo alcune variabili coinvolte nello script: // 1) settiamo la cartella in cui fare l'upload $cartella_upload ="images/"; // 2) settiamo un array in cui indichiamo il tipo di file che consentiamo l'upload // in questo esempio solo immagini $tipi_consentiti = array("gif","png","jpeg","jpg"); // 3) settiamo la dimensione massima del file (1048576 byte = 1Mb) $max_byte = 100000; // se il form è stato inviato if(isset($_POST['up']) and isset($_FILES["upload"])) { // verifichiamo che l'utente abbia selezionato un file if(trim($_FILES["upload"]["name"]) == '') { echo 'Non hai selezionato nessun file!'; } // verifichiamo che il file è stato caricato else if(!is_uploaded_file($_FILES["upload"]["tmp_name"]) or $_FILES["upload"]["error"]>0) { echo 'Si sono verificati problemi nella procedura di upload!'; } // verifichiamo che il tipo è fra quelli consentiti else if(!in_array(strtolower(end(explode('.', $_FILES["upload"]["name"]))),$tipi_consentiti)) { echo 'Il file che si desidera uplodare non è fra i tipi consentiti!'; } // verifichiamo che la dimensione del file non eccede quella massima else if($_FILES["upload"]["size"] > $max_byte) { echo 'Il file che si desidera uplodare eccede la dimensione massima!'; } // verifichiamo che la cartella di destinazione settata esista else if(!is_dir($cartella_upload)) { echo 'La cartella in cui si desidera salvare il file non esiste!'; } // verifichiamo che la cartella di destinazione abbia i permessi di scrittura else if(!is_writable($cartella_upload)) { echo "La cartella in cui fare l'upload non ha i permessi!"; } // verifichiamo il successo della procedura di upload nella cartella settata else if(!move_uploaded_file($_FILES["upload"]["tmp_name"], $cartella_upload.$_FILES["upload"]["name"])) { echo 'Ops qualcosa è andato storto nella procedura di upload!'; } // altrimenti significa che è andato tutto ok else { echo 'Upload eseguito correttamente!'; } } ?> <form action="" method="post" enctype="multipart/form-data"> <input type="file" name="upload"> <input type="submit" name="up" value="Upload file"> </form>
Olimpio Romanella
Sono un appassionato di Web Developing con un particolare debole per php. Mi dedico principalmente dello sviluppo back-end ed in particolare programmazione lato server con php, sviluppo di database relazionali MySql e progettazione di CMS di piccole e medie dimensioni.
Mi avvalgo del framework javascript Jquery, utilizzando molti dei suoi plugin e nei dei miei progetti utilizzo spesso il framework MVC Codeigniter.
17 Commenti presenti
Guida veramente intelligente e utile. Prima spieghi come funziona e poi i particolari, sicuramente ci sarà da approfondire ma mi ha già permeso di creare un sistema di login completo.
Grazie.
Bellissime lezioni, ottime le spiegazioni e gli esempi...davvero un bel lavoro....grazie!
Certo che puoi uploadare intere directory.
<input type="file" id="ctrl" webkitdirectory directory multiple/>
@francesco: mi dispiace ma credo che non sia proprio possibile eseguire l'upload di una intera directory.
Scusate, io ho un problema leggermente diverso: non ho bisogno di scegliere il file dalla tendina, ma devo uploadare tutti i files che risiedono dentro una cartella specifica. Ho provato a costruire un array contenente i nomi di quei files ma l'istruzione move_uploadad_file non funziona (e non da neanche errore, semplicemente non funge). Potete darmi qualche dritta ? Grazie
Funziona perfettamente! Stupendo!
Grazie lo stesso.
Buona serata!
Fabio
Lo script deve necessariamente restituire qualche errore... quale ti compare a video?
Domando gentilmente un aiuto.
Ho creato lo script da voi sopra spiegato e nel mio server lamp (utilizzo Ubuntu) ho creato una cartella images dopo di che ho provato a caricare una foto formato png tramite lo script ma dentro la cartella non trovo nulla! E non trovo nulla nemmeno nel cartella tmp del computer.
Potreste cortesemente spiegarmi dove devo posizionare la cartella 'images' o comunque in cosa consiste il mio sbaglio?
Grazie mille.
Fabio
Ciao, si possono selezionare 2 cartelle su cui caricare i file?
Giorgio
06 June 2020 ore 19:28
Guida veramente intelligente e utile. Prima spieghi come funziona e poi i particolari, sicuramente ci sarà da approfondire ma mi ha già permeso di creare un sistema di login completo.
Grazie.