Thème : Upload de Fichiers et Gestion des Images
Pour permettre aux utilisateurs de charger des fichiers, vous devez :
enctype="multipart/form-data" à la balise <form>fileaccept pour limiter les types de fichiers<form method="POST" action="upload.php" enctype="multipart/form-data">
<input
type="file"
name="image"
accept="image/png, image/jpeg, image/jpg, image/gif"
required
>
<button type="submit">Uploader</button>
</form>
enctype="multipart/form-data", le fichier ne sera pas transmis au serveur !
Limite les types de fichiers visibles dans le sélecteur :
| Type | Valeur accept |
|---|---|
| Images PNG, JPG, GIF | accept="image/png, image/jpeg, image/gif" |
| Tous les fichiers | accept="*/*" |
| PDF uniquement | accept=".pdf" |
Lorsqu'un fichier est uploadé, PHP remplit le tableau $_FILES avec les informations suivantes :
// Pour un input name="image"
$_FILES["image"] = [
"name" => "photo.jpg", // Nom original du fichier
"type" => "image/jpeg", // Type MIME
"tmp_name" => "/tmp/php7x9k8l", // Chemin temporaire
"error" => 0, // Code d'erreur (0 = OK)
"size" => 45230 // Taille en bytes
]
| Code | Signification |
|---|---|
| 0 | OK - Fichier uploadé avec succès |
| 1 | Fichier trop volumineux (dépasse upload_max_filesize) |
| 2 | Fichier trop volumineux (dépasse MAX_FILE_SIZE) |
| 3 | Fichier partiellement uploadé |
| 4 | Aucun fichier n'a été uploadé |
| 6 | Dossier temporaire manquant |
| 7 | Impossible d'écrire le fichier |
// Vérifier que le fichier existe
if (isset($_FILES["image"])) {
$name = $_FILES["image"]["name"];
$type = $_FILES["image"]["type"];
$tmpName = $_FILES["image"]["tmp_name"];
$error = $_FILES["image"]["error"];
$size = $_FILES["image"]["size"];
}
if ($error !== 0) {
die("Erreur lors de l'upload. Code: " . $error);
}
$typesAcceptes = [
"image/jpeg",
"image/png",
"image/gif"
];
if (!in_array($type, $typesAcceptes)) {
die("Type de fichier non accepté : " . $type);
}
$maxSize = 10000000; // 10 MB
if ($size > $maxSize) {
die("Fichier trop volumineux. Taille max: " . $maxSize . " bytes");
}
// Récupérer largeur et hauteur
list($width, $height) = getimagesize($tmpName);
$maxDimension = 5000;
if ($width > $maxDimension || $height > $maxDimension) {
die("Dimensions trop grandes. Max: " . $maxDimension . "x" . $maxDimension);
}
accept est utilisé côté client.
Pour éviter les conflits de noms, générez un nom unique :
// Récupérer l'extension
$extension = pathinfo($name, PATHINFO_EXTENSION);
// Créer un nom unique avec time()
$nom_image = time() . "_" . $name;
// Résultat: "1673456789_photo.jpg"
// Ou plus sûr: juste time() + extension
$nom_image = time() . "." . $extension;
// Résultat: "1673456789.jpg"
La fonction move_uploaded_file() déplace le fichier du répertoire temporaire vers son emplacement final :
$cheminFinal = "../saved_img/" . $nom_image;
if (move_uploaded_file($tmpName, $cheminFinal)) {
echo "Fichier sauvegardé avec succès!";
} else {
echo "Erreur lors de la sauvegarde du fichier.";
}
| Dossier Cible | Chemin depuis api/ |
|---|---|
| saved_img/ | ../saved_img/ |
| uploads/ | ../uploads/ |
| images/temp/ | ../images/temp/ |
// Après move_uploaded_file() réussi
$sql = "INSERT INTO images (nom_fichier) VALUES (?)";
$request = BDD::get()->prepare($sql);
$request->execute([$nom_image]);
echo "Image sauvegardée en BDD!";
Sur la page index.php, récupérez et affichez les images :
<?php
// Récupérer toutes les images
$sql = "SELECT nom_fichier FROM images";
$request = BDD::get()->prepare($sql);
$request->execute();
$images = $request->fetchAll();
?>
<!-- Afficher les images -->
<div class="galerie">
<?php foreach ($images as $image): ?>
<img src="saved_img/<?= htmlspecialchars($image['nom_fichier']) ?>"
alt="Image"
style="max-width: 300px; margin: 10px;">
<?php endforeach; ?>
</div>
htmlspecialchars() pour éviter les injections XSS !
enctype="multipart/form-data" au formulaire$_FILES["image"] existeerror === 0getimagesize()move_uploaded_file()// upload_image.php
include "myBDD.php";
if (isset($_FILES["image"])) {
$name = $_FILES["image"]["name"];
$type = $_FILES["image"]["type"];
$tmpName = $_FILES["image"]["tmp_name"];
$error = $_FILES["image"]["error"];
$size = $_FILES["image"]["size"];
// Validations
if ($error !== 0) die("Erreur: " . $error);
$typesOK = ["image/jpeg", "image/png", "image/gif"];
if (!in_array($type, $typesOK)) die("Type invalide");
if ($size > 10000000) die("Fichier trop volumineux");
list($w, $h) = getimagesize($tmpName);
if ($w > 5000 || $h > 5000) die("Dimensions trop grandes");
// Sauvegarder
$extension = pathinfo($name, PATHINFO_EXTENSION);
$nom_image = time() . "." . $extension;
$cheminFinal = "../saved_img/" . $nom_image;
if (move_uploaded_file($tmpName, $cheminFinal)) {
$sql = "INSERT INTO images (nom_fichier) VALUES (?)";
BDD::get()->prepare($sql)->execute([$nom_image]);
header("Location: ../index.php?success=1");
}
}
htmlspecialchars() pour l'affichage