'Le fichier dépasse la directive upload_max_filesize du php.ini.', UPLOAD_ERR_FORM_SIZE => 'Le fichier dépasse la directive MAX_FILE_SIZE du formulaire.', UPLOAD_ERR_PARTIAL => 'Le fichier n\'a été que partiellement téléchargé.', UPLOAD_ERR_NO_FILE => 'Aucun fichier n\'a été téléchargé.', UPLOAD_ERR_NO_TMP_DIR => 'Un dossier temporaire est manquant.', UPLOAD_ERR_CANT_WRITE => 'Échec de l\'écriture du fichier sur le disque.', UPLOAD_ERR_EXTENSION => 'Une extension PHP a arrêté l\'envoi de fichier.', ]; $message = isset($upload_errors[$file['error']]) ? $upload_errors[$file['error']] : 'Erreur inconnue lors du téléchargement.'; $status_class = 'error'; } // 3. VÉRIFICATION TAILLE elseif ($file['size'] > $max_file_size_mb * 1024 * 1024) { $message = "Le fichier est trop volumineux (Max {$max_file_size_mb}Mo)."; $status_class = 'error'; } else { $file_tmp = $file['tmp_name']; // Nettoyage du nom de fichier pour éviter les caractères spéciaux $file_name = sanitize_file_name($file['name']); // 4. VALIDATION MIME (Sécurité stricte) $finfo = new finfo(FILEINFO_MIME_TYPE); $mime_type = $finfo->file($file_tmp); $allowed = ['image/jpeg', 'image/png', 'image/gif', 'image/webp']; if (!in_array($mime_type, $allowed)) { $message = "Format de fichier non autorisé ($mime_type). Seules les images (JPG, PNG, GIF, WEBP) sont acceptées."; $status_class = 'error'; } else { // 5. PRÉPARATION CURL if (class_exists('CURLFile')) { $cfile = new CURLFile($file_tmp, $mime_type, $file_name); $data = [ 'image' => $cfile, 'source' => 'wordpress_shortcode', 'user_id' => get_current_user_id(), // Envoi de l'ID utilisateur si connecté 'timestamp' => current_time('mysql') ]; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $target_url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); // Timeout connexion curl_setopt($ch, CURLOPT_TIMEOUT, 60); // Timeout exécution totale // Exécution $response = curl_exec($ch); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); $curl_errno = curl_errno($ch); $curl_error = curl_error($ch); curl_close($ch); // 6. ANALYSE DU RÉSULTAT if ($curl_errno) { // Erreur réseau (DNS, Timeout, Port bloqué) $message = 'Impossible de contacter le serveur d\'analyse.'; $debug_info = "Erreur cURL ($curl_errno): $curl_error"; $status_class = 'error'; } else { // Tentative de lecture de la réponse JSON du webhook $json_response = json_decode($response, true); if ($http_code >= 200 && $http_code < 300) { $status_class = 'success'; // Si le webhook renvoie un message spécifique, on l'affiche if (is_array($json_response) && isset($json_response['message'])) { $message = 'Succès : ' . esc_html($json_response['message']); } else { $message = 'Image envoyée et reçue par l\'agent d\'analyse !'; } } else { $status_class = 'error'; $message = "Le serveur a répondu avec une erreur ($http_code)."; // Si le serveur explique pourquoi (ex: "Image corrupted"), on l'affiche if (is_array($json_response) && isset($json_response['message'])) { $debug_info = "Détail : " . esc_html($json_response['message']); } else { $debug_info = "Réponse brute : " . substr(esc_html($response), 0, 200) . "..."; } } } } else { $message = 'Le module PHP cURL est critique et manquant sur ce serveur.'; $status_class = 'error'; } } } } // RENDU HTML ob_start(); ?>

Analyser une image

:
Technique :
Formats acceptés : JPG, PNG, GIF, WEBP. Max : Mo.