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