Creare un form per caricare file con PHP
In questo articolo vedremo come creare un form per caricare file sul nostro sito, sfruttando HTML e PHP.
Per caricare un file sul nostro sito attraverso un form abbiamo bisogno di due pagine: una appunto con il form html e una con il codice php che effettua l’upload vero e proprio. Chiameremo le due pagine form.html e upload.php.
Iniziamo a vedere e analizzare la struttura della pagina form.html:
<!--apriamo il form e specifichiamo il tipo di dati e il metodo di invio--> <form action="upload.php" enctype="multipart/form-data" method="post"> <!--settiamo la dimensione massima dei file in byte, nel nostro caso 1MB=1024000byte--> <input name="MAX_FILE_SIZE" type="hidden" value="1024000" /> File da caricare: <!--campo per la scelta del file--> <input id="file" name="file" type="file" /> <!--bottone di invio--> <input name="submit" type="submit" value="Carica" /> </form>
La particolarità di questo form è l’attributo enctype che nel nostro caso deve essere posto uguale a multipart/form-data, che indica il passaggio di un file da parte del form. Mentre il metodo di invio dei dati (method) deve essere obbligatoriamente di tipo POST, altrimenti il nostro form non funzionerà. Un altro campo molto importante è il MAX_FILE_SIZE che viene dichiarato come nascosto (hidden) e indica la dimensione massima in byte che un file può avere. Questo controllo può essere facilmente raggirato, ma è comunque necessario, vedremo più avanti come incrementare la protezione grazie a PHP. Infine abbiamo il pulsante per dare inizio al caricamento del file, che una volta premuto passerà il controllo alla pagina upload.php, di cui possiamo vedere il codice sorgente:
//controlliamo che il file rispetti le dimensioni impostate
if ($_FILES["file"]["size"] < 1024000){
//controlliamo se ci sono stati errori durante l'upload
if ($_FILES["file"]["error"] > 0){
echo "Codice Errore: " . $_FILES["file"]["error"]."
";
}
else{
//stampo alcune informazioni sul file
//il nome originale
echo "Nome File: " . $_FILES["file"]["name"]."
";
//il mime-type
echo "Tipo File: " . $_FILES["file"]["type"] . "
";
//la dimensione in byte
echo "Dimensione [byte]: " . $_FILES["file"]["size"] . "
";
//il nome del file temporaneo
echo "Nome Temporaneo: " . $_FILES["file"]["tmp_name"] . "
";
//controllo se il file esiste già sul server
if (file_exists("upload/" . $_FILES["file"]["name"])){
echo "Il file " . $_FILES["file"]["name"] . " è già presente sul server";
}
else{
//sposto il file caricato dalla cartella temporanea alla destinazione finale
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
echo "File caricato in: " . "upload/" . $_FILES["file"]["name"];
}
}
}
else{
echo "File troppo grande!!";
}
Prima di analizzare il codice nel particolare è necessaria una breve spiegazione sulla variabile globale $_FILES.
A questo punto possiamo vedere che il primo if controlla che la dimensione del file non ecceda il limite imposto.
Il secondo if invece verifica se sono presenti errori ($_FILES['file']['error'] > 0).
Dopo aver effettuato questi controlli stampiamo alcune informazioni sul file come il nome, il tipo, la dimensione e il nome temporaneo. Successivamente controlliamo che il file non sia già presente sul server per mezzo della funzione file_exists, quindi lo spostiamo dalla cartella temporanea alla cartella finale, in questo caso /upload. Ora il nostro file è disponibile in tale cartella.
Caricamento ...
si ma permette di caricare solo file gif…. se volessi caricare anche jpg o magari zip o win rar???
Il codice di esempio permette di caricare qualsiasi tipo di file.
Ma per fare un form per i commenti a fine articolo tipo questo dove sto scrivendo io come si fa??
Devi creare un form come quello per inviare le email, ma in questo caso le risposte invece di essere inviate vengono salvate all’interno di un database.
io devo creare un form con un campo di tipo text e poi devo caricare un’immagine . come devo fare per avere un unico form???
scusa non sono un esperto: la pagina upload.php dove va messa?
grazie……………
se volessi ricevere i file sulla mia posta?
Ciao, devi metterla nella stessa directory di form.html, lo puoi capire anche dall’attributo action: action=”upload.php” altrimenti sarebbe stato action=”cartella1/cartella2/ecc/upload.php”.
Per riceverli via email devi allegare il file appena caricato.
cortesemente potresti essere più preciso riguardo ai file da allegare via e mail
Per Alessandro
E’ sufficiente aggiungere nel form il campo di testo che vuoi inserire, ad esempio:
<input type=”text” name=”testo”/>
Per maggiori informazioni e esempi puoi consultare la pagina relativa ai form sul sito del w3c.
hey ho testato il tuo “script” funziona alla grande ma c’è un problemino, essendo un modulo che permette di inviare qualsiasi file ho pensato…. e se volessi caricare una shell? ho provato con la c99, l’r57 e una backdoor e tutte e tre funzionavano e venivano caricare alla perfezione
come si fa ad evitare questo genere di upload???
Ma la sintassi è la stessa se io voglio scrivere:
$nome_file = $_FILES ["image"]["name"];
di:
echo “Nome file: “.$_FILES ["image"]["name“].”;
no perchè io quando ho scritto uguale mi dava syntax error. Nel primo caso (parlo di quando vengono scritti uguali) non funziona, mentre nel secondo (con echo) funziona perettamente.
Spiego anche il contesto così magari se puoi mi dai qualche altra info:
devo memorizzare delle immagini in una cartella. Nascondere il nome con una stringa MD5 e salvare il nome della stringa nel database in modo da poi poter richiamare il file come “upload_img/stringa.png” con una query. E quindi volevo salvare il nome del file originale (foto.png) nel database, per ora lasciando perdere le varie hash…c’è un modo? Com’è la sintassi nel caso della variabile?
Grazie in anticipo.
Aggiornamento:
se ad esempio metto:
$nome_file = $_FILES["image"]["name"];
echo “nome file: $nome”;
va lo stesso…quindi poi ad esempio scrivo nel database la stringa $nome_file e non riempie
e non riesco a capire perchè…
Rr-aggiorno:
errore mio. Nel campo nome del mio db avevo messo come valore “0″…io volevo semplicemente che i caratteri da poter inserire fossero infiniti…cmq scusate per il disturbo…
Fai attenzione, le due righe che hai riportato non sono uguali!
Se hai copiato e incollato il codice fai attenzione agli apici, a volte vengono copiati caratteri non corretti.
Ok, prova a postare il codice.
Ok, tranquillo siamo qui per toglierti ogni dubbio!! =)
Devi fare un controllo sul mime type e sull’estensione del file caricato.
se volessi realizzare un sito per caricare file e scaricarli successivamente, il tutto attraverso un login che genere di dominio dovrei acquistare? con quali servizi aggiuntivi?
Ciao Roberta,
per il tipo di sito che vuoi realizzare ti consiglio di sfruttare un’offerta flat, ovvero spazio e banda senza limiti.
Ad ogni modo ti consiglio di leggere la guida che trovi qui.
Spero ti sia utile!
=)