support HEIC/HEIF conversion auto JPEG

This commit is contained in:
Cedric Abonnel
2026-05-12 00:56:15 +02:00
parent b3858af363
commit 1f64d461e7
+20 -3
View File
@@ -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,
};
}