$_FILES
L'array superglobal $_FILES és un array associatiu que PHP utilitza per emmagatzemar la informació dels fitxers pujats a través d'un formulari HTML. Només es pobla si el formulari utilitza el mètode POST i l'atribut enctype="multipart/form-data".
Estructura i propietats
$_FILES és un array bidimensional. La primera clau és l'atribut name del camp de fitxer (<input type="file" name="el_meu_arxiu">). La segona clau són les cinc propietats que descriuen el fitxer:
| Propietat | Descripció | Exemple de Valor | Motiu d'Ús |
name |
El nom original del fitxer al sistema de l'usuari. Atenció: No és segur per utilitzar-lo directament com a nom de destí. | 'foto_de_gats.jpg' |
Per mostrar a l'usuari el nom del fitxer que ha pujat o per registrar-lo. |
type |
El tipus MIME del fitxer, tal com l'ha detectat el navegador. Atenció: Aquest valor és subministrat per l'usuari i pot ser falsificat. | 'image/jpeg' |
Per a una validació inicial del tipus de fitxer. |
size |
La mida del fitxer en bytes. | 1258291 (aproximadament 1.2 MB) |
Essencial per a la validació de la mida i per evitar uploads que excedeixin els límits permesos. |
tmp_name |
La ruta temporal i el nom sota els quals el fitxer pujat s'ha emmagatzemat al servidor web. | /tmp/phpJ74jA |
Aquesta és l'única ruta que cal utilitzar amb la funció move_uploaded_file() per moure el fitxer a la seva ubicació permanent. |
error |
El codi d'error associat a la pujada del fitxer. El valor 0 o UPLOAD_ERR_OK indica una pujada amb èxit. |
0 (Èxit) |
Obligatori per verificar si hi ha hagut problemes com ara excés de mida (PHP o de formulari) o pujades parcials. |
Exemple
Si teniu un camp de fitxer amb name="document", accediríeu a la seva mida amb:
$mida = $_FILES['document']['size'];
Exemple "All in one" (upload_info.php)
Aquest script comprova si s'ha enviat un fitxer. Si no s'ha enviat, mostra el formulari. Si s'ha enviat, processa la pujada i mostra totes les propietats de l'array $_FILES.
<?php
// ----------------------------------------------------
// 1. Lògica de Processament de l'Upload (PHP)
// ----------------------------------------------------
$missatge = "";
$dades_fitxer = null;
// Comprovem si s'ha enviat el formulari amb el mètode POST i si hi ha fitxers.
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['fitxer_pujat'])) {
// El nom 'fitxer_pujat' correspon a l'atribut name de l'input del formulari.
$fitxer = $_FILES['fitxer_pujat'];
// 1.1. Comprovació d'Errors Inicials
if ($fitxer['error'] === UPLOAD_ERR_OK) {
// La pujada ha estat un èxit inicialment.
// Copiem les dades per a la seva visualització.
$dades_fitxer = $fitxer;
// NOTA DE SEGURETAT: En un entorn real, aquí és on faríeu les validacions
// de mida, tipus MIME i utilitzaríeu move_uploaded_file() per moure'l.
// Però per a aquest exemple, només les mostrem sense moure'l ni validar.
$missatge = "<p style='color: green;'> **Fitxer rebut amb èxit!** A continuació es mostren les seves propietats:</p>";
} elseif ($fitxer['error'] === UPLOAD_ERR_NO_FILE) {
$missatge = "<p style='color: orange;'> No s'ha seleccionat cap fitxer per a pujar.</p>";
} else {
// Altres errors (mida excedida, error al servidor, etc.)
$missatge = "<p style='color: red;'> S'ha produït un error en la pujada. Codi d'error: **{$fitxer['error']}**.</p>";
}
}
?>
<!DOCTYPE html>
<html lang="ca">
<head>
<meta charset="UTF-8">
<title>Exemple $_FILES Tot en Un</title>
<style>
body { font-family: Arial, sans-serif; }
.resultat { border: 1px solid #ccc; padding: 15px; background-color: #f9f9f9; }
.resultat h3 { color: navy; }
table { width: 100%; border-collapse: collapse; margin-top: 10px; }
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
th { background-color: #f2f2f2; }
</style>
</head>
<body>
<h1>Upload d'Arxius: Mostra de Propietats `$_FILES`</h1>
<?php
// Mostrem qualsevol missatge generat per la lògica PHP
echo $missatge;
?>
<?php if (!$dades_fitxer): ?>
<p>Selecciona un fitxer per veure les cinc propietats que PHP recull a l'array **`$_FILES`**:</p>
<form action="" method="POST" enctype="multipart/form-data">
<input type="file" name="fitxer_pujat" required>
<button type="submit">Pujar i Mostrar Propietats</button>
</form>
<?php else: ?>
<div class="resultat">
<h3>Dades de l'Arxiu `$_FILES['fitxer_pujat']`</h3>
<table>
<thead>
<tr>
<th>Propietat</th>
<th>Valor</th>
<th>Descripció</th>
</tr>
</thead>
<tbody>
<tr>
<td>`name`</td>
<td><?= htmlspecialchars($dades_fitxer['name']) ?></td>
<td>Nom original del fitxer al sistema de l'usuari.</td>
</tr>
<tr>
<td>`type`</td>
<td><?= htmlspecialchars($dades_fitxer['type']) ?></td>
<td>Tipus MIME del fitxer segons el navegador (no fiable).</td>
</tr>
<tr>
<td>`tmp_name`</td>
<td><?= htmlspecialchars($dades_fitxer['tmp_name']) ?></td>
<td>Ruta temporal on PHP ha guardat el fitxer. **CRÍTICA** per a `move_uploaded_file()`.</td>
</tr>
<tr>
<td>`error`</td>
<td><?= htmlspecialchars($dades_fitxer['error']) ?></td>
<td>Codi d'error de la pujada (0 = èxit).</td>
</tr>
<tr>
<td>`size`</td>
<td><?= htmlspecialchars(number_format($dades_fitxer['size'])) ?> bytes</td>
<td>Mida del fitxer en bytes.</td>
</tr>
</tbody>
</table>
<p><strong>RECORDA:</strong> El fitxer es troba temporalment a la ruta **`tmp_name`** i s'esborrarà automàticament al finalitzar l'execució de l'script si no el mous amb **`move_uploaded_file()`**.</p>
</div>
<?php endif; ?>
</body>
</html>
Funcionament
-
"Tot en Un": L'script
upload_info.phpcomença amb un bloc PHP que comprèn la lògica del servidor. Després, mostra el codi HTML/formulari. -
Detecció de l'Enviament: La condició principal
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['fitxer_pujat']))detecta si l'usuari ha enviat el formulari. Si no l'ha enviat, es mostra només el formulari HTML. -
Accés a
$_FILES: Quan el formulari s'envia, la informació del fitxer és accessible a través de$_FILES['fitxer_pujat'], on'fitxer_pujat'és el valor de l'atributnamedel camp d'entrada. -
Visualització: La secció de resultats (
<?php else: ?>) s'executa i mostra el contingut de cada clau de l'array (name,type,size,tmp_name,error) dins d'una taula.
Propietats addicionals o modificades
És possible que l'array $_FILES d'un arxiu pujat tingui més d'aquestes cinc propietats, especialment quan s'utilitzen certes configuracions o extensions de PHP, o quan es gestionen múltiples pujades.
Les cinc propietats bàsiques (name, type, size, tmp_name, error) són les úniques que garanteix el nucli de PHP. No obstant això, es poden veure propietats addicionals o lleugeres variacions en els següents escenaris:
Gestió de Múltiples Fitxers
Quan s'utilitza l'atribut multiple al camp del formulari (<input type="file" name="arxius[]" multiple>), l'estructura de l'array $_FILES canvia per gestionar la llista de fitxers.
En lloc de tenir un array associatiu simple per a cada propietat, $_FILES esdevé un array on cada clau de propietat conté un sub-array numèric per a cada fitxer pujat.
Si el nom és arxius[] |
Accés a la Propietat |
| Nom del Segon Fitxer | $_FILES['arxius']['name'][1] |
| Mida del Primer Fitxer | $_FILES['arxius']['size'][0] |
| Ruta Temporal del Tercer | $_FILES['arxius']['tmp_name'][2] |
Això no afegeix noves propietats, sinó que canvia l'estructura de com s'organitzen les cinc propietats estàndards.
Extensions PHP i Frameworks
Algunes extensions de PHP o frameworks de tercers poden afegir informació addicional per facilitar el processament o la seguretat:
-
Dades d'extensió personalitzades: Un framework podria llegir el fitxer temporal (
tmp_name) i afegir una propietat comhashochecksum(el hash criptogràfic del contingut) a l'array per a una verificació d'integritat ràpida. -
Resultats de la validació: Un objecte wrapper (que embolcalla l'array
$_FILES) podria afegir una propietat booleana comis_valido una propietat de cadena comvalidation_errorper encapsular els resultats de la validació (mida i tipus MIME) dins d'una única estructura de dades.
No obstant això, si es parla de l'array $_FILES purament generat pel motor de PHP, les úniques cinc propietats que trobaràs són name, type, size, tmp_name, i error.