`targets[].allowedMimeTypes` : chaque cible peut définir sa propre politique (mêmes formes : "all", types exacts, jokers "image/*"…). Absente => la cible hérite du `allowedMimeTypes` global, qui devient la valeur par défaut. Résolu au parsing : chaque `DropTarget` porte toujours une politique. - `POST /upload` et `POST /upload/init` valident contre `target.allowedMimeTypes` (au lieu de la valeur globale). - `GET /targets` renvoie `allowedMimeTypes` ; la page en déduit l'attribut `accept` du sélecteur de fichiers (le serveur reste l'autorité — le glisser-déposer n'est pas filtré). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
37 lines
1,002 B
JSON
37 lines
1,002 B
JSON
{
|
|
"$schema": "./config.schema.json",
|
|
"port": 3000,
|
|
"host": "0.0.0.0",
|
|
"publicUrl": "http://localhost:3000",
|
|
"targets": [
|
|
{
|
|
"name": "photos",
|
|
"label": "Photos",
|
|
"dir": "./uploads/photos",
|
|
"allowedMimeTypes": ["image/*"]
|
|
},
|
|
{
|
|
"name": "videos",
|
|
"label": "Vidéos",
|
|
"dir": "./uploads/videos",
|
|
"allowDirectories": true,
|
|
"allowedMimeTypes": ["video/*"]
|
|
},
|
|
{ "name": "divers", "label": "Divers", "dir": "./uploads/divers" }
|
|
],
|
|
"maxFileSizeMb": 512,
|
|
"logLevel": "info",
|
|
"chunkPoolSize": 30,
|
|
"allowedMimeTypes": ["image/jpeg", "image/png", "image/webp", "video/mp4", "audio/mpeg"],
|
|
"webhooks": [],
|
|
"session": {
|
|
"key": "REMPLACER_PAR_32_OCTETS_BASE64_openssl_rand_base64_32",
|
|
"maxAgeHours": 12
|
|
},
|
|
"oidc": {
|
|
"issuer": "https://auth.exemple.fr/realms/mon-realm",
|
|
"clientId": "mediadrop",
|
|
"clientSecret": "REMPLACER_PAR_LE_SECRET_DU_CLIENT",
|
|
"scopes": ["openid", "profile", "email"]
|
|
}
|
|
}
|