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.
- 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>
- 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
- 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. - Comprovació d'Errors: Utilitzem
$_FILES['file']['error']
per comprovar si hi ha hagut algun error durant la pujada. - Definició del Directori de Destinació: Definim el directori on es desarà el fitxer pujat.
- Comprovació de l'Existència del Fitxer: Comprovem si el fitxer ja existeix al directori de destinació.
- Moure el Fitxer: Utilitzem
move_uploaded_file
per moure el fitxer des de la ubicació temporal al directori de destinació.
- 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; } } } ?>
- 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
- Què és PHP?
- Configuració de l'Entorn de Desenvolupament
- El teu Primer Script PHP
- Sintaxi i Variables de PHP
- Tipus de Dades en PHP
Mòdul 2: Estructures de Control
Mòdul 3: Funcions
- Definició i Crida de Funcions
- Paràmetres de Funció i Valors de Retorn
- Àmbit de Variables
- Funcions Anònimes i Closures
Mòdul 4: Arrays
Mòdul 5: Treballant amb Formularis
Mòdul 6: Treballant amb Fitxers
- Lectura i Escriptura de Fitxers
- Funcions de Gestió de Fitxers
- Permisos de Fitxers
- Funcions de Directori
Mòdul 7: Programació Orientada a Objectes (OOP)
- Introducció a OOP
- Classes i Objectes
- Propietats i Mètodes
- Herència
- Interfícies i Classes Abstractes
- Traits
Mòdul 8: Treballant amb Bases de Dades
- Introducció a les Bases de Dades
- Connexió a una Base de Dades MySQL
- Realització d'Operacions CRUD
- Ús de PDO per a la Interacció amb Bases de Dades
- Seguretat en Bases de Dades
Mòdul 9: Tècniques Avançades de PHP
- Gestió d'Errors i Excepcions
- Sessions i Cookies
- Expressions Regulars
- Treballant amb JSON i XML
- PHP i Serveis Web
Mòdul 10: Frameworks PHP i Millors Pràctiques
- Introducció als Frameworks PHP
- Començant amb Laravel
- Arquitectura MVC
- Millors Pràctiques en Desenvolupament PHP
- Proves i Depuració