Ves al contingut principal

$_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:

PHP
$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
<?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

  1. "Tot en Un": L'script upload_info.php comença amb un bloc PHP que comprèn la lògica del servidor. Després, mostra el codi HTML/formulari.

  2. 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.

  3. 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'atribut name del camp d'entrada.

  4. 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 com hash o checksum (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 com is_valid o una propietat de cadena com validation_error per 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.