From 3aa2ea451c0fc80f23a888b8653f43b7e45e66b2 Mon Sep 17 00:00:00 2001 From: Valentin ROBIN Date: Tue, 25 Aug 2026 19:33:36 +0200 Subject: [PATCH] =?UTF-8?q?Corrige=20un=20d=C3=A9calage=20Content-Type/ext?= =?UTF-8?q?ension=20=C3=A0=20l'upload=20d'images=20sur=20le=20Mur=20(Safar?= =?UTF-8?q?i/iPhone)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit canvas.toBlob demandait du WebP en dur, mais un navigateur qui ne sait pas l'encoder (Safari, historiquement) retombe silencieusement sur du PNG — le fichier était quand même uploadé étiqueté "webp". L'extension et le Content-Type suivent maintenant le type réel du blob. Remplace aussi le message générique "Une erreur est survenue" par des messages distincts par étape (compression/upload/validation serveur), avec le détail technique loggé en console pour diagnostiquer plus vite la prochaine fois. Co-Authored-By: Claude Sonnet 5 --- src/app/mur/mur-view.tsx | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/src/app/mur/mur-view.tsx b/src/app/mur/mur-view.tsx index 778c28f..c35551c 100644 --- a/src/app/mur/mur-view.tsx +++ b/src/app/mur/mur-view.tsx @@ -308,20 +308,30 @@ export function MurView({ if (imageFile) { try { const blob = await resizeImageToBlob(imageFile); - const path = `${crypto.randomUUID()}.webp`; + // L'extension/le Content-Type suivent le type RÉEL du blob rendu par + // canvas.toBlob (pas "image/webp" en dur) : certains navigateurs + // (Safari notamment, webp encodé via canvas longtemps mal supporté) + // retombent silencieusement sur du PNG malgré le type demandé — + // uploader ce PNG sous une étiquette "webp" trompeuse pouvait faire + // échouer des vérifications en aval qui, elles, regardent le vrai + // contenu (l'optimiseur d'image de next/image par exemple). + const extension = blob.type === "image/png" ? "png" : blob.type === "image/jpeg" ? "jpg" : "webp"; + const path = `${crypto.randomUUID()}.${extension}`; const { error: uploadError } = await supabase.storage .from("wall-images") - .upload(path, blob, { contentType: "image/webp" }); + .upload(path, blob, { contentType: blob.type || "image/webp" }); if (uploadError) { setPosting(false); - setError("Impossible d'envoyer l'image, réessaie."); + console.error("Échec de l'envoi de l'image sur le Mur :", uploadError); + setError(`Envoi de l'image impossible (${uploadError.message}). Réessaie.`); return; } const { data: publicUrlData } = supabase.storage.from("wall-images").getPublicUrl(path); imageUrl = publicUrlData.publicUrl; - } catch { + } catch (err) { setPosting(false); - setError("Impossible de traiter l'image, réessaie."); + console.error("Échec du traitement de l'image sur le Mur :", err); + setError("Traitement de l'image impossible (format non supporté ?) — réessaie sans image ou avec une autre photo."); return; } } @@ -333,12 +343,15 @@ export function MurView({ setPosting(false); if (rpcError) { + console.error("Échec de post_wall_note :", rpcError); setError( rpcError.message.includes("already posted") ? "Tu as déjà publié une note aujourd'hui." : rpcError.message.includes("wall full") ? "Le mur est déjà complet pour aujourd'hui." - : "Une erreur est survenue, réessaie.", + : rpcError.message.includes("image invalide") + ? "L'image n'a pas pu être validée côté serveur — réessaie sans image ou avec une autre photo." + : `Publication impossible (${rpcError.message}). Réessaie.`, ); refetch(); return;