'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();
?>