Corrige un décalage Content-Type/extension à l'upload d'images sur le Mur (Safari/iPhone)
Build and deploy / deploy (push) Successful in 36s
Build and deploy / deploy (push) Successful in 36s
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 <noreply@anthropic.com>
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user