Gestion des fichiers et images en PHP

Apprenez à manipuler, valider et traiter des fichiers et images en PHP : upload, miniatures, formats, erreurs, etc.

Introduction

La gestion des fichiers est une compétence essentielle en PHP : que ce soit pour permettre à un utilisateur d'uploader une image, générer des miniatures, lire un fichier texte ou manipuler des PDF, PHP propose de nombreuses fonctions natives et bibliothèques.

Exemples d'usages :
  • Permettre à un utilisateur d'envoyer une photo de profil
  • Créer des miniatures pour une galerie d'images
  • Lire et analyser un fichier CSV
  • Générer un PDF à partir de données

1. Upload de fichiers en PHP

L'upload de fichiers se fait via un formulaire HTML avec l'attribut enctype="multipart/form-data". PHP place les fichiers uploadés dans $_FILES.

Exemple de formulaire d'upload

<form action="upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="mon_fichier">
    <button type="submit">Envoyer</button>
</form>

Traitement côté PHP

// upload.php : traitement de l'upload // 1. Vérifier qu'un fichier a bien été envoyé et qu'il n'y a pas d'erreur if (isset($_FILES['mon_fichier']) && $_FILES['mon_fichier']['error'] === 0) { // 2. Récupérer le nom temporaire et le nom d'origine $tmpName = $_FILES['mon_fichier']['tmp_name']; $name = basename($_FILES['mon_fichier']['name']); // 3. Vérifier l'extension du fichier (sécurité)
    $allowed = ['jpg', 'jpeg', 'png', 'gif', 'pdf'];
    $ext = strtolower(pathinfo($name, PATHINFO_EXTENSION));
    if (in_array($ext, $allowed)) {
        // 4. Déplacer le fichier dans le dossier uploads
        move_uploaded_file($tmpName, 'uploads/' . $name);
        echo "Fichier uploadé avec succès !";
    } else {
        // Extension non autorisée
        echo "Extension non autorisée.";
    }
} else {
    // Erreur lors de l'upload (taille, pas de fichier, etc.)
    echo "Erreur lors de l'upload.";
}
Explications détaillées :
  • 1. On vérifie que le fichier a bien été envoyé et qu'il n'y a pas d'erreur (code erreur 0).
  • 2. On récupère le nom temporaire (sur le serveur) et le nom d'origine (nom du fichier sur l'ordinateur de l'utilisateur).
  • 3. On vérifie l'extension pour éviter les fichiers dangereux (ex : .php).
  • 4. Si tout est OK, on déplace le fichier dans le dossier uploads/.
  • Sinon, on affiche un message d'erreur adapté.
Attention : Toujours valider le type et la taille du fichier côté serveur pour éviter les failles de sécurité.

2. Manipulation d'images avec GD

La librairie GD permet de redimensionner, recadrer, ajouter du texte ou des filtres sur des images. Elle est incluse par défaut avec PHP.

Créer une miniature (thumbnail)

// Créer une miniature 150x150px à partir d'une image uploadée
$src = 'uploads/photo.jpg';
$dst = 'uploads/miniature.jpg';
$img = imagecreatefromjpeg($src);
$mini = imagecreatetruecolor(150, 150);
imagecopyresampled($mini, $img, 0, 0, 0, 0, 150, 150, imagesx($img), imagesy($img));
imagejpeg($mini, $dst);
imagedestroy($img);
imagedestroy($mini);
Astuce : Pour PNG utilisez imagecreatefrompng et imagepng.

3. Gestion des erreurs lors des opérations sur les fichiers

Il est important de vérifier les erreurs lors de la manipulation de fichiers (droit d'écriture, fichier manquant, etc.).

// Lecture d'un fichier avec gestion d'erreur
$filename = 'uploads/monfichier.txt';
if (file_exists($filename)) {
    $contenu = file_get_contents($filename);
    echo $contenu;
} else {
    echo "Fichier introuvable.";
}

4. Lire et écrire différents formats de fichiers

PHP permet de lire/écrire des fichiers texte, CSV, JSON, XML, etc.

Lire un fichier CSV

// Lecture d'un fichier CSV ligne par ligne
$f = fopen('uploads/contacts.csv', 'r');
while (($row = fgetcsv($f, 1000, ',')) !== false) {
    echo implode(' | ', $row) . "
"
; } fclose($f);

Lire/écrire du JSON

// Écrire un tableau PHP dans un fichier JSON
$data = ["nom" => "Alice", "age" => 30];
file_put_contents('uploads/data.json', json_encode($data));

// Lire un fichier JSON
$json = file_get_contents('uploads/data.json');
$data = json_decode($json, true);

5. Aller plus loin : Imagick, PDF, sécurité

Pour des traitements avancés sur les images (filtres, rotation, conversion de format, etc.), utilisez Imagick (extension PHP pour ImageMagick).

Pour aller plus loin :
  • Générez des PDF avec mPDF ou TCPDF
  • Protégez vos dossiers d'upload (permissions, .htaccess, antivirus...)
  • Vérifiez la taille, le type MIME et le contenu des fichiers uploadés

6. Manipulation avancée d'images avec Imagick

Imagick est une extension PHP puissante basée sur ImageMagick, idéale pour des traitements avancés sur les images (filtres, effets, conversion de format, etc.).

// Redimensionner et convertir une image en PNG avec Imagick
$img = new Imagick('uploads/photo.jpg');
$img->resizeImage(200, 200, Imagick::FILTER_LANCZOS, 1);
$img->setImageFormat('png');
$img->writeImage('uploads/photo-mini.png');
$img->clear();
$img->destroy();
Astuce : Imagick permet aussi d'ajouter du texte, des filtres, de détecter le format, etc. Consultez la documentation officielle.

7. Générer des PDF en PHP

Pour générer des fichiers PDF dynamiquement (factures, rapports, etc.), utilisez une bibliothèque comme mPDF ou TCPDF.

Exemple avec mPDF

// Générer un PDF simple avec mPDF (installation via Composer)
require_once 'vendor/autoload.php';
$mpdf = new \Mpdf\Mpdf();
$mpdf->WriteHTML('

Bonjour PDF

Document généré en PHP !

'
); $mpdf->Output('mon-fichier.pdf', 'I'); // Affiche dans le navigateur
À savoir : mPDF et TCPDF permettent de styliser vos PDF avec du HTML/CSS, d'ajouter des images, des tableaux, etc.

8. Sécurité avancée pour les fichiers uploadés

La sécurité des fichiers uploadés est cruciale pour éviter les failles (exécution de code malveillant, virus, etc.). Voici les bonnes pratiques à appliquer :

Attention : Ne faites jamais confiance au nom ou à l'extension du fichier envoyé par l'utilisateur !