From 1f64d461e73ba711cf92aee1cb92b1513c3f930e Mon Sep 17 00:00:00 2001 From: Cedric Abonnel Date: Tue, 12 May 2026 00:56:15 +0200 Subject: [PATCH] support HEIC/HEIF conversion auto JPEG --- src/ArticleManager.php | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/ArticleManager.php b/src/ArticleManager.php index 89e1843..68b2aeb 100644 --- a/src/ArticleManager.php +++ b/src/ArticleManager.php @@ -608,15 +608,30 @@ class ArticleManager $mime = mime_content_type($uploadedFile['tmp_name']) ?: 'application/octet-stream'; if (str_starts_with($mime, 'image/')) { + // HEIC/HEIF : converti en JPEG (non supporté nativement par les navigateurs) + if (in_array($mime, ['image/heic', 'image/heif'], true) && extension_loaded('imagick')) { + try { + $img = new \Imagick($uploadedFile['tmp_name']); + $img->setImageFormat('jpeg'); + $img->setImageCompressionQuality(88); + $converted = tempnam(sys_get_temp_dir(), 'vl_heic_') . '.jpg'; + $img->writeImage($converted); + $img->destroy(); + $uploadedFile['tmp_name'] = $converted; + $mime = 'image/jpeg'; + } catch (\Exception $e) { + // Échec conversion → stocke tel quel + } + } + $ext = $this->extFromMime($mime) ?? strtolower(pathinfo($uploadedFile['name'], PATHINFO_EXTENSION)) ?: 'jpg'; $hash = substr(hash_file('sha256', $uploadedFile['tmp_name']), 0, 16); - $size = $uploadedFile['size'] ?? filesize($uploadedFile['tmp_name']); + $size = filesize($uploadedFile['tmp_name']); $name = "{$hash}-{$size}.{$ext}"; $dest = $dir . '/' . $name; - // Même hash = même contenu : pas de collision réelle - if (!move_uploaded_file($uploadedFile['tmp_name'], $dest)) { + if (!rename($uploadedFile['tmp_name'], $dest) && !move_uploaded_file($uploadedFile['tmp_name'], $dest)) { return null; } return $name; @@ -667,6 +682,8 @@ class ArticleManager 'image/gif' => 'gif', 'image/avif' => 'avif', 'image/svg+xml' => 'svg', + 'image/heic' => 'jpg', + 'image/heif' => 'jpg', default => null, }; }