Upload de fichier
La gestion des fichiers avec dnax
Création de Collection de fichiers
Création d'une collection nommé médias pour tous les types de documents à uploader
import {define} from "@dnax/core"
export default define.Collection({
slug:'medias', // nom de la collection , un dossier est cree automatiquement avec ce nom
type:'media', // media pur les fichiers et document pour les documents mongodb
media:{
enabled:true, // Activation des uploads
visibility:'public', // public/private
},
access:{
allAction:()=>true
},
fields:[ // relation avec d'autre collection
{
name:'uploadBy',
type:'relationship',
relation:{
to:'users',
}
}
]
})Nb: Un dossier est automatiquement généré /root_project/upload/medias/public
Upload de fichier via le SDK
import {useRest} from "@dnax/sdk"
const rest = useRest({
...config // tes config
})
// Upload de fichiers
//await rest.upload("medias",medias,data)
// data:Array<object>|object|null (optional)
//medias : Fichier Blob ou FormaData
// data : les champs de la collection
let response = await rest.upload('medias',medias,{
uploadBy:'67acc8792b768a3be68cdb44'
})
console.log(response)
// retourne un tableau des fichiers.
[
{
"uploadBy": "67acc8792b768a3be68cdb44",
"name": "(0)-Cahier des charges SI PPP v1.3.pdf",
"type": "file",
"parent": "67b620170fb8902976795cfc",
"_file": {
"original_name": "Cahier des charges SI PPP v1.3.pdf",
"name": "54a544c3-a611-4dcf-956d-85bffb2f23d2-CahierdeschargesSIPPPv1.3.pdf",
"type": "application/pdf",
"size": 495897,
"path": "/files/documents/private/54a544c3-a611-4dcf-956d-85bffb2f23d2-CahierdeschargesSIPPPv1.3.pdf"
},
"createdAt": "2025-03-18T19:23:14.939Z",
"updatedAt": "2025-03-18T19:23:14.939Z",
"_id": "67d9c822b4f325c7313fa2e1"
}
]Les champs automatiquement ajoutés :
_file
orginal_name : Nom original du fichier
name: Nom du fichier sur le disk
type: type du fichier
size : taille en octet du fichier
path: Lien d'accès via le web
Les autres champs :
createdAt
updatedAt
_id
uploadBy et les autres fields...
Access aux fichiers
rest.asset(response._file.path)Hooks des medias
import { define, Adapter } from "@dnax/core";
import { getCascadeDocuments } from "#/src/utils";
export default define.Collection({
slug: "documents",
type: "media",
media: {
enabled: true,
visibility: "private",
},
access: {
allAction: () => true,
},
hooks: {
beforeUpload: async ({ files, rest, data,error }) => {
console.log('Files',files)
}
},
fields: [
{
name: "uploadBy",
type: "relationship",
relation: {
to: "users",
},
required: true, // champs réquis
},
],
});
Private mode
Nb: En mode privé vous devriez créer votre propre endpoint pour servir le fichier.
Ex :
import { define } from "@dnax/core";
import fs from "fs-extra";
import path from "path";
const PRIVATE_DOCUMENT_FOLDER = "/uploads/medias/private";
const PUBLIC_URL="/static/documents"
import mime from "mime-types";
export default define.Endpoint({
enabled: true,
handler: ({ router }) => {
router.get(PUBLIC_URL, (c) => {
let file = c.req.query("file"); // name of file
let FULL_PATH = path.join(process.cwd() + PRIVATE_DOCUMENT_FOLDER, file);
let exist = fs.existsSync(FULL_PATH);
if (file && exist) {
let file_ = fs.readFileSync(FULL_PATH);
let mimeType = mime.lookup(FULL_PATH);
console.log("mimeType:", mimeType);
return c.body(file_, 200, {
"Content-Type": mimeType || "application/octet-stream",
});
}
return c.json({ message: "Ressource not found" });
});
},
});
Last updated