PHP Creare un form upload
Costruire un modulo per allegare file
Autore: Andrea Pacchiarotti
Ultimo aggiornamento: 01 Febbraio 2023
Categoria: Web Marketing Costruzione siti web Form PHP

Un form PHP è un modulo HTML che consente agli utenti di inviare informazioni al server utilizzando il metodo HTTP (ad esempio, GET o POST). Il server quindi utilizza PHP per elaborare le informazioni inviate e fornire una risposta all'utente. Un form PHP Upload, invece, è un modulo che consente agli utenti di caricare file sul server. In questo caso, il server utilizza PHP per gestire il caricamento del file, ad esempio, controllando il tipo di file, la dimensione del file o la posizione di destinazione del file sul server. Un esempio di utilizzo di questo tipo di form potrebbe essere l'upload di immagini, video o documenti.
In questo articolo vedremo, dunque, come costruire un modulo per allegare file o, per dirla in maniera più tecnica, capiremo come creare un form upload in PHP. Partiremo con la spiegazione del semplice invio dell'allegato fino ad arrivare a un form che contemplerà, oltre all'allegato, ulteriori campi (destinatario, mittente, oggetto, messaggio). Se sei a corto di nozioni leggi prima Come inviare un form creato in HTML (alla fine dell'articolo potrai scaricare i codici).
Se non ti interessa il PHP puoi mandare form con Google Moduli. Se usi WordPress leggi come configurare Contact Form 7. Ma ora concentriamoci su PHP Creare un form upload.
- Creare il modulo di upload in HTML
- Creare il codice PHP che permette l'upload
- Implementazione dei controlli
- Verificare che il file non sia troppo grande
- Verificare che l'upload non sovrascriva un altro file
- Verificare l'estensione del file caricato
- Verificare se il file è effettivamente un’immagine
- Upload di una serie di file
- Creare il modulo di upload insieme a ulteriori campi
Creare il modulo di upload in HTML
Per effettuare il caricamento (upload) di un file sul server, in questo esempio un’immagine .jpg o .png, occorre creare un modulo (form) in HTML, corredato eventualmente da un po’ di CSS, per permettere all’utente la selezione del file dal proprio computer e il successivo invio tramite il metodo POST.
Ecco, limitato allo stretto necessario, il codice HTML del form di upload:
<form enctype="multipart/form-data" method="POST">
<input type="hidden" name="MAX_FILE_SIZE" value="4194304">
Carica un'immagine in formato jpg o png<br>
<input type="file" name="immagine"><br><br>
<input type="submit" value="Invia"><br>
Il tempo di caricamento dipende dalla tua velocità di connessione. <br>
Attendi la scritta: "File inviato con successo." per essere sicuro di aver spedito il file.
</form>
Due parole di spiegazione:
- Nel tag di apertura del form manca l’attributo action="nomefile.php" in quanto il codice PHP si trova nella stessa pagina del form di invio quindi, se si intende fare un file PHP a parte, va introdotto l’attributo suddetto
- L’attributo enctype con valore "multipart/form-data" del tag <form> è necessario al funzionamento del sistema di caricamento, in particolare l'attributo, che può essere usato solo con method=”POST”, specifica come i dati del modulo devono essere codificati durante l'invio al server
- Il campo nascosto nominato MAX_FILE_SIZE è facoltativo, ma se usato deve precedere il campo di immissione del file; esso va a specificare la dimensione massima in byte per il file, in questo esempio pari a 4 MB (1.048.576 di byte è infatti pari ad 1 MB)
- L’input di tipo file permette la selezione dell’immagine in quanto crea un pulsante che consente all'utente di selezionare un file dal proprio computer
Creare il codice PHP che permette l'upload
PHP prevede una variabile superglobale $_FILES, ovvero un vettore (array) con le informazioni sul file caricato; l'array ha la seguente struttura:
- $_FILES["immagine"]["name"]
permette di conoscere il nome del file caricato - $_FILES["immagine"]["type"]
permette di conoscere il tipo di file caricato in formato MIME type - $_FILES["immagine"]["size"]
permette di conoscere la dimensione del file caricato - $_FILES["immagine"]["tmp_name"]
permette di conoscere percorso e nome del file temporaneo sul server - $_FILES["immagine"]["error"]
rappresenta un codice numerico compreso fra 0 e 8 indicante il tipo di errore che si è verificato, è pari a 0 in assenza di errore
Ecco il codice, in versione minimale, per recuperare il file e metterlo nella cartella mioupload, creata da noi all’interno del server, che ospiterà i file caricati dall’utente attraverso il form:
<?php
/ verifico, attraverso la funzione is_uploaded_file, che il file sia stato caricato
if (!isset($_FILES['immagine']) || !is_uploaded_file($_FILES['immagine']['tmp_name'])) {
echo 'File non inviato';
exit;
}
/imposto il percorso della cartella dove mettere il file caricato dall’utente
$uploaddir = 'mioupload/';
/recupero il percorso temporaneo del file
$immagine_tmp = $_FILES['immagine']['tmp_name'];
/recupero il nome originale del file caricato
$immagine_name = $_FILES['immagine']['name'];
/ verifico, attraverso la funzione move_uploaded_file, se il file è stato spostato nella cartella mioupload del server
if (move_uploaded_file($immagine_tmp, $uploaddir . $immagine_name)) {
echo 'File inviato';
}else{
echo 'Caricamento invalido';
}
?>
Due parole di spiegazione anche qui:
- La funzione is_uploaded_file (string filename) restituisce TRUE se il file denominato filename è stato caricato tramite l'HTTP POST. Ciò risulta utile per essere sicuri che un utente malintenzionato non abbia provato a lavorare su file non consentiti
- La funzione move_uploaded_file (string filename, string destination) verifica che il file denominato filename è validamente caricato, cioè è stato caricato attraverso il metodo HTTP POST di PHP). Se il file è valido, verrà spostato nella cartella data da destination.
Se invece filename non è un file validamente caricato, non verranno compiute azioni e move_uploaded_file() ritornerà FALSE.
Se filename è un file validamente caricato, ma non può essere mosso per qualche ragione, non verrà compiuto alcunchè e move_uploaded_file() restituirà FALSE e verrà visualizzato un avviso di pericolo.
Implementazione dei controlli
La verifica sul fatto che il file sia stato caricato è già presente all’inizio del codice minimale appena proposto, ecco ulteriori verifiche.
Verificare che il file non sia troppo grande
// limito la dimensione massima a 4MB
if ($_FILES['immagine']['size'] > 4194304) {
echo 'Il file non può eccedere i 4 MB';
exit;
}
Verificare che l'upload non sovrascriva un altro file
$target_file = 'mioupload/' . $_FILES['immagine']['name'];
if (file_exists($target_file)) {
echo 'Il file esiste già';
exit;
}
La funzione file_exists(path) controlla se esiste un file o una directory.
Verificare l'estensione del file caricato
Ovviamente si può mettere qualsiasi estensione, qui sono presenti solo quelle di alcuni tipi di immagine, ma tale controllo è molto importante per evitare di essere attaccati con l’invio di codici che potrebbero compromettere la sicurezza del proprio server.
$ext_ok = array('jpg', 'jpeg', 'png');
$temp = explode('.', $_FILES['immagine']['name']);
$ext = end($temp);
if (!in_array($ext, $ext_ok)) {
echo 'Puoi caricare solo file jpg o png';
exit;
}
La funzione in_array(search, array, type) cerca un valore specifico in una matrice.
Verificare se il file è effettivamente un’immagine
$is_img = getimagesize($_FILES['immagine']['tmp_name']);
if (!$is_img) {
echo 'Puoi inviare solo un’immagine';
exit;
}
Upload di una serie di file
<form enctype="multipart/form-data" action="upload.php" method="POST">
<p>Fotografie:
<input type="file" name="pic []">
<input type="file" name="pic []">
<input type="file" name="pic []">
<input type="submit" value="Invia">
</p>
</form>
<?php
foreach ($_FILES["pic"]["error"] as $key => $error) {
if ($error == UPLOAD_ERR_OK) {
$tmp_name = $_FILES["pic"]["tmp_name"][$key];
$name = $_FILES["pic"]["name"][$key];
move_uploaded_file($tmp_name, "data/$name");
}
}
?>
Creare il modulo di upload insieme a ulteriori campi
Per inviare una mail con allegato, ma questa volta insieme ad altri campi, è possibile sfruttare la funzione mail() del PHP, mentre per spedire l'allegato interverremo nella proprietà filename del messaggio. Ecco il codice PHP completo:
<?php
/ Recupero il valore dei campi del modulo
$destinatario = 'pacchiarotti@gmail.com';
$mittente = $_POST['mittente'];
$oggetto = $_POST['oggetto'];
$messaggio = $_POST['messaggio'];
/ Valorizzo le variabili relative all'allegato
$allegato = $_FILES['allegato']['tmp_name'];
$allegato_type = $_FILES['allegato']['type'];
$allegato_name = $_FILES['allegato']['name'];
/ Creo due variabili per uso interno
$headers = "From: " . $mittente;
$msg = "";
/ Verifico se il file è stato caricato correttamente via HTTP, in caso positivo proseguo
if (is_uploaded_file($allegato))
{
/ Apro e leggo l'allegato
$file = fopen($allegato,'rb');
$data = fread($file, filesize($allegato));
fclose($file);
/ Adatto il file al formato MIME base64 usando base64_encode
$data = chunk_split(base64_encode($data));
/ Genero il separatore per dividere la parte testuale dall'allegato
$semi_rand = md5(time());
$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";
/ Aggiungo le intestazioni per l'allegato
$headers .= "\nMIME-Version: 1.0\n";
$headers .= "Content-Type: multipart/mixed;\n";
$headers .= " boundary=\"{$mime_boundary}\"";
/ Definisco il tipo di messaggio (MIME/multi-part)
$msg .= "This is a multi-part message in MIME format.\n\n";
/ Metto il separatore
$msg .= "--{$mime_boundary}\n";
/ Ecco la parte testuale del messaggio
$msg .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n";
$msg .= "Content-Transfer-Encoding: 7bit\n\n";
$msg .= $messaggio . "\n\n";
/ Metto il separatore
$msg .= "--{$mime_boundary}\n";
/ Ecco l'allegato
$msg .= "Content-Disposition: attachment; filename=\"{$allegato_name}\"\n";
$msg .= "Content-Transfer-Encoding: base64\n\n";
$msg .= $data . "\n\n";
/ Chiudo con il separatore
$msg .= "--{$mime_boundary}--\n";
}
/ Se non è stato caricato alcun file preparo un messaggio
else
{
$msg = $messaggio;
}
/ Invio la mail
if (mail($destinatario, $oggetto, $msg, $headers))
{
echo "Mail inviata con successo!";
}else{
echo "Errore!";
}
?>
Ora che hai letto PHP Creare un form upload, scarica i codici per il form in PHP.
Per saperne di più sul Web Marketing potrebbero interessarti questi libri: