Les fichiers
Les fichiers sont rangés dans BSPK_FILE. Deux blocs y touchent : fieldInputFile en dépose un, renderFile en affiche un.
Servir un fichier : l'autorisation par la session
Les images sont publiques, via /images/. Tout le reste — les PDF en particulier — passe par /bspk-file, dont le modèle d'autorisation mérite d'être compris parce qu'il est inhabituel.
C'est le rendu qui fait autorité. Quand renderFile.html produit un lien « ouvrir dans un nouvel onglet », tous les contrôles d'affichage ont déjà été évalués avec le contexte complet : droits du bloc, droits de la page, droits du domaine, affichage conditionnel. À ce moment-là, le rendu enregistre une autorisation :
Session.storage.vo_FileGrants[$fileUuid]:=Timestamp
La route /bspk-file ne réévalue ensuite rien. Elle sert le fichier si et seulement si l'autorisation existe dans la session de ce visiteur (BSPK_WEB_ON_CONNECTION).
Pourquoi ne pas revérifier ? Parce que la route s'exécute hors du contexte de rendu : les formules qui dépendent de variables process y donneraient des faux négatifs, et refuseraient des fichiers que le visiteur consulte légitimement. Un fichier qu'aucun bloc visible n'a exposé ne reçoit jamais d'autorisation : il ne peut donc jamais être récupéré.
Conséquence pratique : un lien direct vers
/bspk-fileéchoue dans une session neuve, même pour un fichier que l'utilisateur voit après avoir chargé la page. C'est le comportement attendu, pas un bug : la page doit d'abord être rendue.
Les vignettes
Le gestionnaire de fichiers du dev-panel obtient ses vignettes par /bspk-thumb, servies depuis BSPK_FILE.thumbnail, plutôt que d'insérer du base64 dans le balisage. Un BLOB de taille nulle signifie « pas de vignette, ou image corrompue » : ce n'est pas une erreur.
Les vignettes sont générées à la demande. Après avoir remplacé une image, purgez les images dérivées, sinon l'ancienne vignette continue de s'afficher.
Écrire un fichier par l'API
L'API Claude ne peut pas écrire un BLOB. Pour remplacer une image, passez par la méthode de mise à jour de version, avec l'image dans Resources/images/, puis purgez les images dérivées.
Attention aussi aux accents dans le nom d'un fichier envoyé : côté curl, il faut --data-binary @file, sinon ils arrivent abîmés.
File.name retire l'extension
Utilisez fullName. Ce piège a déjà produit, sans le moindre message, des fichiers nommés invoice au lieu de invoice.pdf.
Voir aussi
- Fichier — 26 propriétés, dont 15 conditionnelles
- Champs fichier — envoi, glisser-déposer, types acceptés

