Aller au contenu principal

Uploader des fichiers via un JSON Schema

attention

Un fichier encodé au format base64 va entraîner une augmentation de 33% à 300% comparativement à sa taille initiale, source MDN.

Création d'un JSON Schema​

La première étape consiste à créer un JSON Schema, vous pouvez réaliser cette opération lors de la configuration d'un type de contenu ou donnée. Votre schéma devra définir une propriété de type data-url qui permettra de sélectionner un fichier à partir du formulaire qui sera généré.

Pour notre exemple, nous allons configurer un type de contenu Page pour permettre l'ajout de fichiers ne devant pas être accessibles depuis la médiathèque :

JSON Schema
{
"properties": {
"files": {
"type": "array",
"title": "Fichiers",
"items": {
"properties": {
"name": {
"type": "string",
"title": "Nom du fichier"
},
"base64": {
"type": "string",
"format": "data-url"
}
}
}
}
}
}

Image

Contraintes sur les fichiers​

Vous pouvez ajouter des contraintes afin de définir les types de fichiers autorisés par l'intermédiaire d'un UI Schema :

UI Schema
{
"files": {
"items": {
"base64": {
"ui:options": {
"accept": [".pdf", ".svg"]
}
}
}
}
}
attention

La validation d'un UI Schema est réalisée seulement au niveau du navigateur.

Création d'une page de contenu​

Nous pourrons observer depuis l'onglet Personnalisation le formulaire correspondant au JSON Schema préalablement configuré :

Image

Concernant le fichier de sortie, vous pourrez observer la génération d'une propriété files qui contient la liste des fichiers encodés en base64 :

Image

Exploiter les fichiers​

Page.js
import Svg from "../Page/Svg"
import Pdf from "../Page/Pdf"

export default function Page({ page }) {
return (
<>
<h1>{page.title}</h1>
{
page.files?.map((file, index) => {
const fileType = file.base64.split(";").shift()
switch (fileType) {
case "data:image/svg+xml":
return <Svg key={index} file={file} />
case "data:application/pdf":
return <Pdf key={index} file={file} />
default:
return <span>Undefined file type</span>
}
})
}
</>
)
}
Svg.js
export default function Svg({ file }) {
return (
<img src={file.base64} alt={file.name}/>
)
}
Pdf.js
export default function Pdf({ file }) {
return (
<object data={file.base64} type="application/pdf" width="100%" height="500px">
<p>Unable to display PDF file. <a href={file.base64}>Download</a> instead.</p>
</object>
)
}