From 547d7feed68e89957f062b8ed9b988f28c5830ce Mon Sep 17 00:00:00 2001 From: polo Date: Sun, 3 Aug 2025 00:23:11 +0200 Subject: =?UTF-8?q?r=C3=A9organisation=203:=20classes=20controller?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controller/ImageUploadController.php | 184 +++++++++++++++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 src/controller/ImageUploadController.php (limited to 'src/controller/ImageUploadController.php') diff --git a/src/controller/ImageUploadController.php b/src/controller/ImageUploadController.php new file mode 100644 index 0000000..29b8059 --- /dev/null +++ b/src/controller/ImageUploadController.php @@ -0,0 +1,184 @@ +readImageBlob($image_data); + $imagick->stripImage(); // nettoyage métadonnées + $imagick->setImageFormat($format); + if($format === 'jpeg'){ + $imagick->setImageCompression(Imagick::COMPRESSION_JPEG); + $imagick->setImageCompressionQuality(85); // optionnel + } + $imagick->writeImage($local_path); // enregistrement + $imagick->clear(); + $imagick->destroy(); + return true; + } + catch(Exception $e){ + return false; + } + } + static public function curlDownloadImage(string $url, $maxRetries = 3, $timeout = 10): string|false + { + $attempt = 0; + $imageData = false; + + while($attempt < $maxRetries){ + $ch = curl_init($url); // instance de CurlHandle + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); + curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); + curl_setopt($ch, CURLOPT_USERAGENT, 'TinyMCE-Image-Downloader'); + + $imageData = curl_exec($ch); + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + //$curlError = curl_error($ch); + + curl_close($ch); + + if($imageData !== false && $httpCode >= 200 && $httpCode < 300){ + return $imageData; + } + + $attempt++; + sleep(1); + } + + return false; // échec après trois tentatives + } + + // téléchargement par le plugin (bouton "insérer une image") + static public function imageUploadTinyMce(): void + { + if(isset($_FILES['file'])){ + $file = $_FILES['file']; + $dest = 'images/'; + $dest_mini = 'images-mini/'; + + // Vérifier si les répertoires existent, sinon les créer + if(!is_dir($dest)) { + mkdir($dest, 0700, true); + } + if(!is_dir($dest_mini)) { + mkdir($dest_mini, 0700, true); + } + + $allowed_extensions = ['jpg', 'jpeg', 'png', 'gif', 'webp', 'tiff', 'tif']; + $name = Security::secureFileName(pathinfo($file['name'], PATHINFO_FILENAME)); + $extension = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION)); + if(!in_array($extension, $allowed_extensions) || $extension === 'jpg'){ + $extension = 'jpeg'; + } + $file_path = $dest . $name . '_' . uniqid() . '.' . $extension; + + // créer une miniature de l'image + // + + if(self::imagickCleanImage(file_get_contents($file['tmp_name']), $file_path, $extension)){ // recréer l’image pour la nettoyer + echo json_encode(['location' => $file_path]); // renvoyer l'URL de l'image téléchargée + } + else{ + http_response_code(500); + echo json_encode(['message' => 'Erreur image non valide']); + } + } + else{ + http_response_code(400); + echo json_encode(['message' => 'Erreur 400: Bad Request']); + } + die; + } + + // collage de HTML => recherche de balises , téléchargement côté serveur et renvoi de l'adresse sur le serveur + static public function uploadImageHtml(): void + { + $json = json_decode(file_get_contents('php://input'), true); + + if(isset($json['image_url'])){ + $image_data = self::curlDownloadImage($json['image_url']); // téléchargement de l’image par le serveur avec cURL au lieu de file_get_contents + $dest = 'images/'; + + if(!is_dir($dest)) { // Vérifier si le répertoire existe, sinon le créer + mkdir($dest, 0777, true); + } + + if($image_data === false){ + http_response_code(400); + echo json_encode(['message' => "Erreur, le serveur n'a pas réussi à télécharger l'image."]); + die; + } + + $allowed_extensions = ['jpg', 'jpeg', 'png', 'gif', 'webp', 'tiff', 'tif']; + $url_path = parse_url($json['image_url'], PHP_URL_PATH); + $name = Security::secureFileName(pathinfo($url_path, PATHINFO_FILENAME)); + $extension = strtolower(pathinfo($url_path, PATHINFO_EXTENSION)); + if(!in_array($extension, $allowed_extensions) || $extension === 'jpg'){ + $extension = 'jpeg'; + } + $local_path = $dest . $name . '_' . uniqid() . '.' . $extension; + + if(self::imagickCleanImage($image_data, $local_path, $extension)){ // recréer l’image pour la nettoyer + echo json_encode(['location' => $local_path]); // nouvelle adresse + } + else{ + http_response_code(500); + echo json_encode(['message' => 'Erreur image non valide']); + } + } + else{ + echo json_encode(['message' => 'Erreur 400: Bad Request']); + } + die; + } + + // collage simple d'une image (base64 dans le presse-papier) non encapsulée dans du HTML + static public function uploadImageBase64(): void + { + $json = json_decode(file_get_contents('php://input'), true); + $dest = 'images/'; + + if(!is_dir('images')){ + mkdir('images', 0777, true); + } + + // détection de data:image/ et de ;base64, et capture du format dans $type + if(!isset($json['image_base64']) || !preg_match('/^data:image\/(\w+);base64,/', $json['image_base64'], $type)){ + http_response_code(400); + echo json_encode(['message' => 'Données image base64 manquantes ou invalides']); + die; + } + + $allowed_extensions = ['jpg', 'jpeg', 'png', 'gif', 'webp', 'tiff', 'tif']; + $extension = strtolower($type[1]); + if(!in_array($extension, $allowed_extensions) || $extension === 'jpg'){ + $extension = 'jpeg'; + } + + $image_data = base64_decode(substr($json['image_base64'], strpos($json['image_base64'], ',') + 1)); // découpe la chaine à la virgule puis convertit en binaire + if($image_data === false){ + http_response_code(400); + echo json_encode(['message' => 'Décodage base64 invalide']); + die; + } + + $local_path = $dest . 'pasted_image_' . uniqid() . '.' . $extension; + + if(self::imagickCleanImage($image_data, $local_path)){ + echo json_encode(['location' => $local_path]); + } + else{ + http_response_code(500); + echo json_encode(['message' => 'Erreur image non valide']); + } + die; + } +} \ No newline at end of file -- cgit v1.2.3