In PHP, la variabile superglobale $_FILES è un array associativo che contiene tutte le informazioni sui file caricati tramite un form HTML che utilizza enctype="multipart/form-data".
Ogni file caricato viene rappresentato in $_FILES come un sotto-array che contiene dati come il nome del file, il tipo MIME, la dimensione, il nome temporaneo e gli eventuali errori.
🔹 Struttura base di $_FILES
La struttura di $_FILES per un singolo input file è la seguente:
$_FILES["nome_input"] = array(
"name" => "nomefile.jpg",
"type" => "image/jpeg",
"tmp_name" => "/tmp/php1234.tmp",
"error" => 0,
"size" => 204800
);
🔹 Chiavi principali di $_FILES
| Chiave | Descrizione | Esempio |
|---|---|---|
$_FILES["file"]["name"] | Nome originale del file caricato. | foto.jpg |
$_FILES["file"]["type"] | Tipo MIME del file. | image/jpeg |
$_FILES["file"]["tmp_name"] | Percorso temporaneo del file sul server. | /tmp/phpXYZ.tmp |
$_FILES["file"]["error"] | Codice di errore associato al caricamento. | 0 (nessun errore) |
$_FILES["file"]["size"] | Dimensione del file in byte. | 24567 |
🔹 Codici di errore comuni
| Codice | Significato |
|---|---|
| 0 | Nessun errore, upload riuscito. |
| 1 | Il file supera la dimensione massima impostata in php.ini (upload_max_filesize). |
| 2 | Il file supera il limite specificato nel form HTML (MAX_FILE_SIZE). |
| 3 | Il file è stato caricato solo parzialmente. |
| 4 | Nessun file è stato caricato. |
| 6 | Cartella temporanea mancante. |
| 7 | Errore nel salvataggio del file su disco. |
🔹 Esempio base di upload
<form method="post" enctype="multipart/form-data">
Scegli un file: <input type="file" name="file"><br><br>
<input type="submit" value="Carica">
</form>
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if ($_FILES["file"]["error"] == 0) {
move_uploaded_file($_FILES["file"]["tmp_name"], "uploads/" . $_FILES["file"]["name"]);
echo "File caricato con successo!";
} else {
echo "Errore nel caricamento del file.";
}
}
?>
🔹 Nota di sicurezza
È importante verificare sempre il tipo e la dimensione del file prima di salvarlo sul server.
Evita di fidarti del nome del file originale e usa pathinfo() o mime_content_type() per controllare il formato effettivo.
<?php
$estensione = pathinfo($_FILES["file"]["name"], PATHINFO_EXTENSION);
if ($estensione != "jpg" && $estensione != "png") {
echo "Formato non consentito!";
exit;
}
?>
LABORATORIO
Caricare un file con $_FILES
In questo laboratorio imparerai a creare un modulo HTML per caricare file su un server PHP utilizzando la variabile $_FILES. Scoprirai come accedere alle informazioni del file e come gestire in modo sicuro il salvataggio sul server.
- Editor di codice (VS Code, PhpStorm, Notepad++)
- Server locale con PHP (XAMPP, MAMP, Laragon)
- Una cartella uploads/ nella directory del progetto con permessi di scrittura
1 Creare il modulo HTML
Crea un file chiamato upload-file.php e inserisci il seguente modulo HTML che consente di selezionare un file da caricare:
<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="UTF-8">
<title>Laboratorio $_FILES</title>
</head>
<body>
<h2>Carica un file</h2>
<form method="post" enctype="multipart/form-data">
Scegli un file: <input type="file" name="file"><br><br>
<input type="submit" value="Carica file">
</form>
</body>
</html>
2 Gestire il caricamento con PHP
Aggiungi sotto al form il seguente script PHP per gestire il caricamento e spostare il file nella cartella uploads/.
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (isset($_FILES["file"]) && $_FILES["file"]["error"] == 0) {
$nome = $_FILES["file"]["name"];
$tmp = $_FILES["file"]["tmp_name"];
$destinazione = "uploads/" . basename($nome);
if (move_uploaded_file($tmp, $destinazione)) {
echo "<p style='color:green'>File caricato con successo: $nome</p>";
} else {
echo "<p style='color:red'>Errore nel salvataggio del file.</p>";
}
} else {
echo "<p style='color:red'>Errore durante l'upload. Codice: " . $_FILES["file"]["error"] . "</p>";
}
}
?>
3 Mostrare informazioni sul file caricato
Dopo aver caricato un file, puoi mostrare tutte le informazioni ottenute da $_FILES:
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST" && $_FILES["file"]["error"] == 0) {
echo "<h4>Dettagli del file:</h4>";
echo "<ul>";
foreach ($_FILES["file"] as $chiave => $valore) {
echo "<li><b>" . htmlspecialchars($chiave) . ":</b> " . htmlspecialchars($valore) . "</li>";
}
echo "</ul>";
}
?>
4 Limitare il tipo e la dimensione dei file
È buona pratica accettare solo alcuni tipi di file (es. immagini) e limitare la dimensione massima:
<?php
$tipo = mime_content_type($_FILES["file"]["tmp_name"]);
$dimensione = $_FILES["file"]["size"];
if ($dimensione > 2 * 1024 * 1024) { // 2 MB
echo "<p style='color:red'>Il file è troppo grande.</p>";
exit;
}
if (!in_array($tipo, ["image/jpeg", "image/png", "image/gif"])) {
echo "<p style='color:red'>Solo file immagine consentiti (JPG, PNG, GIF).</p>";
exit;
}
?>
5 Test e analisi
- Apri upload-file.php nel browser.
- Seleziona un file dal tuo computer e clicca su Carica file.
- Controlla la cartella uploads/ per verificare che il file sia stato salvato.
- Prova a caricare file di tipo o dimensione non consentita per verificare la validazione.