Chargement...

Upload de fichiers

Dans le développement PHP, les fichiers sont généralement envoyés via des formulaires HTML et gérés avec la superglobale $_FILES. Cette variable contient toutes les informations relatives au fichier uploadé : nom, type, taille et emplacement temporaire. La gestion des uploads exige une bonne compréhension de concepts PHP clés tels que la syntaxe, les structures de données (tableaux et objets), les algorithmes de traitement de fichiers et les principes de la programmation orientée objet (POO) pour concevoir des systèmes robustes et sécurisés.
Ce tutoriel avancé vous enseignera comment implémenter des uploads sécurisés et efficaces, incluant la vérification du type et de la taille des fichiers, la gestion des erreurs et l'organisation des répertoires. Vous apprendrez également à intégrer cette fonctionnalité dans une architecture logicielle globale, tout en suivant les bonnes pratiques PHP, assurant ainsi la stabilité, la sécurité et la maintenabilité des projets.

Exemple de Base

php
PHP Code
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (isset($_FILES['fichier']) && $_FILES['fichier']['error'] === UPLOAD_ERR_OK) {
$dossierUpload = __DIR__ . '/uploads/';
$fichierUpload = $dossierUpload . basename($_FILES['fichier']['name']);

if ($_FILES['fichier']['size'] > 5 * 1024 * 1024) {
echo "Le fichier est trop volumineux.";
exit;
}

$typeFichier = mime_content_type($_FILES['fichier']['tmp_name']);
if (!in_array($typeFichier, ['image/jpeg', 'image/png', 'image/gif'])) {
echo "Type de fichier non supporté.";
exit;
}

if (move_uploaded_file($_FILES['fichier']['tmp_name'], $fichierUpload)) {
echo "Fichier uploadé avec succès.";
} else {
echo "Échec de l'upload du fichier.";
}
} else {
echo "Aucun fichier sélectionné.";
}
}
?>

<form method="post" enctype="multipart/form-data">
Sélectionnez un fichier : <input type="file" name="fichier">
<input type="submit" value="Uploader">
</form>

Dans cet exemple de base, le script commence par vérifier que la méthode de requête est POST, ce qui est essentiel pour traiter un upload de manière sécurisée. La superglobale $_FILES permet de déterminer si un fichier a été uploadé et d’identifier d’éventuelles erreurs via $_FILES['fichier']['error']. Le script définit ensuite un dossier d’upload et utilise basename pour éviter toute attaque de type traversée de répertoire.
La vérification de la taille du fichier prévient toute surcharge mémoire, tandis que mime_content_type contrôle le type MIME pour autoriser uniquement les formats définis, renforçant la sécurité. La fonction move_uploaded_file déplace de manière sûre le fichier depuis son emplacement temporaire vers le répertoire cible, conformément aux bonnes pratiques PHP. Cet exemple illustre un flux de travail complet pour l’upload de fichiers, combinant syntaxe, tableaux et logique conditionnelle, et constitue la base pour des implémentations plus avancées.

Exemple Pratique

php
PHP Code
<?php
class UploadFichier {
private string $dossier;
private array $typesAutorises;
private int $tailleMax;

public function __construct(string $dossier, array $types, int $tailleMB) {
$this->dossier = $dossier;
$this->typesAutorises = $types;
$this->tailleMax = $tailleMB * 1024 * 1024;
if (!is_dir($dossier)) {
mkdir($dossier, 0755, true);
}
}

public function upload(array $fichier): bool {
if ($fichier['error'] !== UPLOAD_ERR_OK) {
throw new RuntimeException('Erreur lors de l\'upload du fichier.');
}

if ($fichier['size'] > $this->tailleMax) {
throw new RuntimeException('Fichier trop volumineux.');
}

$typeFichier = mime_content_type($fichier['tmp_name']);
if (!in_array($typeFichier, $this->typesAutorises)) {
throw new RuntimeException('Type de fichier non supporté.');
}

$destination = $this->dossier . basename($fichier['name']);
if (!move_uploaded_file($fichier['tmp_name'], $destination)) {
throw new RuntimeException('Échec du déplacement du fichier.');
}
return true;
}
}

try {
$uploader = new UploadFichier(__DIR__ . '/uploads/', ['image/jpeg','image/png'], 5);
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$uploader->upload($_FILES['fichier']);
echo "Fichier uploadé avec succès en POO.";
}
} catch (RuntimeException $e) {
echo "Erreur : " . $e->getMessage();
}
?>

<form method="post" enctype="multipart/form-data">
Sélectionnez un fichier : <input type="file" name="fichier">
<input type="submit" value="Uploader">
</form>

Dans cet exemple avancé, l’upload est encapsulé dans une classe UploadFichier, appliquant les principes de la programmation orientée objet (POO) pour améliorer l’organisation et la réutilisabilité du code. Le constructeur initialise le répertoire d’upload, les types autorisés et la taille maximale, créant le dossier si nécessaire.
La méthode upload utilise RuntimeException pour gérer les erreurs, séparant ainsi la logique métier de la gestion des erreurs, ce qui rend le système plus robuste. Les vérifications de type et de taille, combinées à move_uploaded_file, garantissent un traitement sécurisé. Cette approche est adaptée aux projets complexes, facile à maintenir et extensible, tout en respectant les bonnes pratiques PHP en matière de sécurité et de performance.

Pour optimiser la performance, configurez correctement upload_max_filesize et post_max_size, créez les dossiers au besoin et définissez les permissions appropriées. Les considérations de sécurité comprennent l’interdiction des fichiers exécutables, la vérification des types MIME et des extensions, et la restriction des chemins d’upload. Suivre ces pratiques garantit un upload de fichiers sûr, efficace et maintenable dans des projets PHP réels.

📊 Tableau de Référence

PHP Element/Concept Description Usage Example
$_FILES Tableau superglobal contenant les informations sur le fichier uploadé $_FILES['fichier']['name']
move_uploaded_file Déplace de manière sécurisée un fichier temporaire vers un répertoire cible move_uploaded_file($_FILES['fichier']['tmp_name'], $destination)
mime_content_type Récupère le type MIME d’un fichier $type = mime_content_type($_FILES['fichier']['tmp_name']);
UPLOAD_ERR_OK Constante indiquant un upload réussi if ($_FILES['fichier']['error'] === UPLOAD_ERR_OK)
mkdir Créer un répertoire si celui-ci n’existe pas mkdir($dossier, 0755, true);
RuntimeException Gestion des exceptions pour les erreurs d’upload throw new RuntimeException('Upload échoué');

🧠 Testez Vos Connaissances

Prêt à Commencer

Testez Vos Connaissances

Mettez-vous au défi avec ce quiz interactif et voyez à quel point vous comprenez le sujet

3
Questions
🎯
70%
Pour Réussir
♾️
Temps
🔄
Tentatives

📝 Instructions

  • Lisez chaque question attentivement
  • Sélectionnez la meilleure réponse pour chaque question
  • Vous pouvez refaire le quiz autant de fois que vous le souhaitez
  • Votre progression sera affichée en haut