En aquest tema, aprendrem com gestionar la pujada de fitxers en PHP. La pujada de fitxers és una funcionalitat comuna en moltes aplicacions web, com ara formularis de registre, aplicacions de gestió de continguts, etc. Veurem com configurar un formulari per pujar fitxers, com processar la pujada al servidor i com gestionar errors comuns.

  1. Configuració del Formulari HTML

Per començar, necessitem un formulari HTML que permeti als usuaris seleccionar un fitxer per pujar. El formulari ha de tenir l'atribut enctype establert a multipart/form-data i utilitzar el mètode POST.

<!DOCTYPE html>
<html lang="ca">
<head>
    <meta charset="UTF-8">
    <title>Pujada de Fitxers</title>
</head>
<body>
    <form action="upload.php" method="post" enctype="multipart/form-data">
        <label for="file">Selecciona un fitxer:</label>
        <input type="file" name="file" id="file">
        <input type="submit" value="Pujar Fitxer">
    </form>
</body>
</html>

  1. Processament de la Pujada al Servidor

Quan l'usuari envia el formulari, el fitxer seleccionat es puja al servidor. PHP proporciona una superglobal anomenada $_FILES per accedir a la informació del fitxer pujat.

Exemple de Codi PHP per Processar la Pujada

<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    // Comprovar si hi ha errors en la pujada
    if ($_FILES['file']['error'] == UPLOAD_ERR_OK) {
        $target_dir = "uploads/";
        $target_file = $target_dir . basename($_FILES["file"]["name"]);
        
        // Comprovar si el fitxer ja existeix
        if (file_exists($target_file)) {
            echo "Ho sentim, el fitxer ja existeix.";
        } else {
            // Intentar moure el fitxer pujat a la carpeta de destinació
            if (move_uploaded_file($_FILES["file"]["tmp_name"], $target_file)) {
                echo "El fitxer " . htmlspecialchars(basename($_FILES["file"]["name"])) . " s'ha pujat correctament.";
            } else {
                echo "Ho sentim, hi ha hagut un error en pujar el fitxer.";
            }
        }
    } else {
        echo "Ho sentim, hi ha hagut un error en pujar el fitxer.";
    }
}
?>

Explicació del Codi

  1. Comprovació del Mètode de Sol·licitud: Primer, comprovem si el mètode de sol·licitud és POST per assegurar-nos que el formulari s'ha enviat.
  2. Comprovació d'Errors: Utilitzem $_FILES['file']['error'] per comprovar si hi ha hagut algun error durant la pujada.
  3. Definició del Directori de Destinació: Definim el directori on es desarà el fitxer pujat.
  4. Comprovació de l'Existència del Fitxer: Comprovem si el fitxer ja existeix al directori de destinació.
  5. Moure el Fitxer: Utilitzem move_uploaded_file per moure el fitxer des de la ubicació temporal al directori de destinació.

  1. Gestió d'Errors Comuns

Errors de Pujada

PHP defineix diverses constants per gestionar errors de pujada:

Constant Descripció
UPLOAD_ERR_OK No hi ha hagut cap error, el fitxer s'ha pujat correctament.
UPLOAD_ERR_INI_SIZE El fitxer pujat excedeix la directiva upload_max_filesize a php.ini.
UPLOAD_ERR_FORM_SIZE El fitxer pujat excedeix la directiva MAX_FILE_SIZE especificada al formulari HTML.
UPLOAD_ERR_PARTIAL El fitxer només s'ha pujat parcialment.
UPLOAD_ERR_NO_FILE No s'ha pujat cap fitxer.
UPLOAD_ERR_NO_TMP_DIR Falta una carpeta temporal.
UPLOAD_ERR_CANT_WRITE No s'ha pogut escriure el fitxer al disc.
UPLOAD_ERR_EXTENSION Una extensió de PHP ha aturat la pujada del fitxer.

Exemple de Gestió d'Errors

<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $error = $_FILES['file']['error'];
    if ($error == UPLOAD_ERR_OK) {
        // Processar la pujada
    } else {
        switch ($error) {
            case UPLOAD_ERR_INI_SIZE:
            case UPLOAD_ERR_FORM_SIZE:
                echo "El fitxer és massa gran.";
                break;
            case UPLOAD_ERR_PARTIAL:
                echo "El fitxer només s'ha pujat parcialment.";
                break;
            case UPLOAD_ERR_NO_FILE:
                echo "No s'ha pujat cap fitxer.";
                break;
            case UPLOAD_ERR_NO_TMP_DIR:
                echo "Falta una carpeta temporal.";
                break;
            case UPLOAD_ERR_CANT_WRITE:
                echo "No s'ha pogut escriure el fitxer al disc.";
                break;
            case UPLOAD_ERR_EXTENSION:
                echo "Una extensió de PHP ha aturat la pujada del fitxer.";
                break;
            default:
                echo "Error desconegut.";
                break;
        }
    }
}
?>

  1. Exercici Pràctic

Enunciat

Crea un formulari HTML que permeti als usuaris pujar una imatge. El servidor ha de comprovar que el fitxer pujat és una imatge (per exemple, JPG, PNG o GIF) i desar-lo en una carpeta anomenada images. Si el fitxer no és una imatge, ha de mostrar un missatge d'error.

Solució

Formulari HTML

<!DOCTYPE html>
<html lang="ca">
<head>
    <meta charset="UTF-8">
    <title>Pujada d'Imatges</title>
</head>
<body>
    <form action="upload_image.php" method="post" enctype="multipart/form-data">
        <label for="image">Selecciona una imatge:</label>
        <input type="file" name="image" id="image">
        <input type="submit" value="Pujar Imatge">
    </form>
</body>
</html>

Codi PHP

<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $error = $_FILES['image']['error'];
    if ($error == UPLOAD_ERR_OK) {
        $target_dir = "images/";
        $target_file = $target_dir . basename($_FILES["image"]["name"]);
        $imageFileType = strtolower(pathinfo($target_file, PATHINFO_EXTENSION));

        // Comprovar si el fitxer és una imatge
        $check = getimagesize($_FILES["image"]["tmp_name"]);
        if ($check !== false) {
            // Comprovar si el fitxer ja existeix
            if (file_exists($target_file)) {
                echo "Ho sentim, el fitxer ja existeix.";
            } else {
                // Intentar moure el fitxer pujat a la carpeta de destinació
                if (move_uploaded_file($_FILES["image"]["tmp_name"], $target_file)) {
                    echo "La imatge " . htmlspecialchars(basename($_FILES["image"]["name"])) . " s'ha pujat correctament.";
                } else {
                    echo "Ho sentim, hi ha hagut un error en pujar la imatge.";
                }
            }
        } else {
            echo "El fitxer no és una imatge.";
        }
    } else {
        echo "Ho sentim, hi ha hagut un error en pujar la imatge.";
    }
}
?>

Conclusió

En aquesta secció, hem après com configurar un formulari HTML per pujar fitxers, com processar la pujada al servidor amb PHP i com gestionar errors comuns. També hem vist un exemple pràctic de com comprovar que el fitxer pujat és una imatge. Aquestes habilitats són fonamentals per a moltes aplicacions web que necessiten gestionar fitxers pujats pels usuaris.

Curs de Programació PHP

Mòdul 1: Introducció a PHP

Mòdul 2: Estructures de Control

Mòdul 3: Funcions

Mòdul 4: Arrays

Mòdul 5: Treballant amb Formularis

Mòdul 6: Treballant amb Fitxers

Mòdul 7: Programació Orientada a Objectes (OOP)

Mòdul 8: Treballant amb Bases de Dades

Mòdul 9: Tècniques Avançades de PHP

Mòdul 10: Frameworks PHP i Millors Pràctiques

Mòdul 11: Projecte: Construint una Aplicació Web

© Copyright 2024. Tots els drets reservats