0
votes

NODEJS Enregistrer le fichier téléchargé

J'ai une application et dans cette application, je souhaite utiliser un mécanisme de téléchargement de fichier.

Mon exigence est la suivante: p>

Une fois le fichier téléchargé, son nom sera modifié en quelque chose unique, comme uuid4 (). Je vais stocker ce nom dans la base de données ultérieurement. P>

J'ai écrit quelque chose comme ça, mais j'ai quelques questions: p>

var storage = multer.diskStorage({
    destination: function (req, file, cb) {
        cb(null, '/tmp/my-uploads')
    },
    filename: function (req, file, cb) {
        cb(null, file.fieldname + '-' + Date.now())
  }
})

var upload = multer({ storage: storage })


3 commentaires

Le nom de fichier est appelé chaque fois qu'un fichier est téléchargé, de sorte que vous obtenez un identifiant différent. Ensuite, le nouveau nom doit être avielable à req.file


@Rashomon, donc, si je désigne le nom comme UUID, je peux atteindre ce nom de l'appel d'API req.file.fieldname ?


J'ai un exemple de travail devant moi et son stocké dans une propriété appelée nom de fichier oui. Ce n'est pas exactement pareil, car j'utilise Multidupload


3 Réponses :


0
votes

Je pense que tu as eu tort ... tu as dit que

Je ne peux pas la modifier à chaque fois que j'appelle cette API.

mais en fait, le nom de fichier est appelé à chaque fois pour chaque fichier. Laissez-moi expliquer cette partie du code ... xxx

ici, consultez la fonction Callback (noté par cb ) :

  • 1er argument null dans la fonction de rappel est comme convention . Vous passez toujours null comme premier argument dans une fonction de rappel. Voir cette référence
  • 2ème argument détermine ce que le fichier doit être nommé dans le dossier de destination . Donc, ici, vous pouvez spécifier n'importe quelle fonction, ce qui peut vous rappeler un nom de fichier unique à chaque fois.

    puisque vous utilisez mangouste ... Je pense que ce serait mieux si vous implémentez votre référence Uniquefilename () à l'aide de la méthode Mongoose dans votre schéma (dans lequel vous souhaitez enregistrer le chemin de fichier) et l'appeler votre gestionnaire de route. En savoir plus


0 commentaires

1
votes

Merci à @Rashomon et à @eimran Hossain Eimon, j'ai résolu le problème. Si quelqu'un se demande la solution, voici:

const multer = require('multer');
var storage = multer.diskStorage({
    destination: function (req, file, cb) {
        // the file is saved to here
        cb(null, '/PATH/TO/FILE')
    },
    filename: function (req, file, cb) {
        // the filename field is added or altered here once the file is uploaded
        cb(null, uuidv4() + '.xlsx')
    }
})
var upload = multer({ storage: storage })


router.post('/', middleware.checkToken, upload.single('file'), (req,res,next)=>{
    // the file is taken from multi-form and the key of the form must be "file"

    // visible name of the file, which is the original, uploaded name of the file
    const name = req.file.originalname;

    // name of the file to be stored, which contains unique uuidv4
    const fileName = req.file.filename;
    // get rid of the extension of the file ".xlsx"
    const file_id = fileName.substring(0, fileName.lastIndexOf('.'));

    // TODO
    // Right now, only xlsx is supported
    const type = "xlsx";

    const myObject = new DatabaseObject({
        _id : new mongoose.Types.ObjectId(),
        file_id: file_id,
        name : name,
        type: "xlsx"
    })

    myObject .save()
    .then(savedObject=>{
        // return some meaningful response
    }).catch(err=>{
        // return error response
    })
})
  • Si UUIDV4 renvoie un identifiant qui existe déjà (je pense qu'il est très improbable car l'objet contient des données d'horodatage), retentissez la fonction de renommage. P> LI>

  • Si vous obtiendrez une erreur dans l'enregistrement de la base de données, je devrais supprimer le fichier téléchargeé pour éviter les conflits futurs. P> LI> ul>

    Si vous avez des solutions pour ces problèmes aussi, je suis très apprécié. p> p>


1 commentaires

1: Si vous avez déjà utilisé un long horodatage, c'est assez. 2: Dans le cas d'une erreur d'erreur d'enregistrement de dB, saisissez l'erreur sur Enregistrer () Fonction et supprimez le fichier avec nom_fichier Nom



0
votes
  1. Pas besoin. Parce que vous utilisez des horodatages.

  2. En cas d'erreur lors de l'enregistrement de la base de données, vous pouvez supprimer le fichier téléchargé à l'aide de ce code afin d'éviter les conflits futurs. Essayez ceci: XXX

    Voir aussi NODEJS System System Doc


0 commentaires