Éditeur de contenu

Bibliothèque médias

Organisation des fichiers uploadés

Tous les fichiers téléversés sont stockés dans le dossier uploads/, protégé par un fichier .htaccess qui bloque l'exécution de PHP. Les fichiers peuvent être organisés en sous-dossiers que vous créez depuis la bibliothèque médias du back-office. L'arborescence est arbitraire et reflète votre organisation éditoriale.

Formats supportés

Images

  • JPEG (.jpg, .jpeg)
  • PNG (.png)
  • WebP (.webp)
  • GIF (.gif)
  • SVG (.svg) — avec sanitisation obligatoire

Vidéos

  • MP4 (.mp4), WebM (.webm), OGV (.ogv), M4V (.m4v)

Vérification MIME et limites de taille

L'extension de fichier seule ne suffit pas pour valider un upload. QuietCMS utilise finfo_open(FILEINFO_MIME_TYPE) pour lire la signature binaire réelle du fichier, indépendamment du nom fourni par le client :

$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime  = finfo_file($finfo, $tmpPath);
finfo_close($finfo);

if (!in_array($mime, $allowedMimes)) {
    throw new \RuntimeException('Type MIME non autorisé : ' . $mime);
}

Les limites de taille par défaut sont :

  • Images — 10 Mo (limité par upload_max_filesize et post_max_size dans php.ini)
  • Vidéos — 500 Mo (nécessite d'augmenter les directives PHP et éventuellement le timeout)

Sanitisation du nom de fichier

Le nom d'origine fourni par le navigateur n'est jamais conservé. QuietCMS génère un nom unique combinant un slug ASCII et un timestamp :

// Nom original : "Mon Image (2).PNG"
// Nom stocké   : "mon-image-1716292800.webp"

Cette stratégie élimine les risques liés aux noms de fichiers contenant des caractères spéciaux ou des séquences de traversal (../).

Conversion WebP automatique

À l'upload, les images JPEG et PNG sont automatiquement converties en WebP par la classe ImageService, qui utilise l'extension PHP GD ou Imagick (selon disponibilité) :

// Dans ImageService::convert()
$image = imagecreatefromjpeg($sourcePath);
imagewebp($image, $destPath, 82); // qualité 82 par défaut
imagedestroy($image);

Le WebP offre en moyenne 25-35 % de gain de poids par rapport au JPEG à qualité visuelle équivalente. Le fichier original est supprimé après conversion réussie.

Sanitisation des SVG

Les fichiers SVG peuvent contenir du JavaScript malveillant ou des balises <foreignObject> exploitables. QuietCMS parse le SVG uploadé avec DOMDocument et retire toute balise ou attribut dangereux avant de l'enregistrer sur le disque :

$dom = new \DOMDocument();
$dom->loadXML($svgContent, LIBXML_NONET);
// Suppression des <script>, <foreignObject>, attributs on*
SvgSanitizer::clean($dom);
$safeSvg = $dom->saveXML();

Alt text et gestion des métadonnées

Chaque fichier média dispose d'un champ alt text éditable depuis la bibliothèque. Ce texte est inséré dans la balise <img alt="..."> lorsque vous sélectionnez l'image depuis l'éditeur. Les métadonnées (alt, titre, dossier) sont stockées dans uploads/media.json.

Thumbnails

La classe ThumbHelper génère des vignettes à la volée (ou en cache) pour l'affichage dans la bibliothèque et les listes d'articles. Les dimensions sont configurables dans les paramètres du thème actif.

Articles similaires