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 Réponses :
Je pense que tu as eu tort ... tu as dit que
Je ne peux pas la modifier à chaque fois que j'appelle cette API. P> BlockQuote>
mais en fait, le nom de fichier code> est appelé à chaque fois pour chaque fichier. Laissez-moi expliquer cette partie du code ... p>
xxx pré> ici, consultez la fonction
Callback code> (noté par
cb code>) : p>
- 1er argument
null code> dans la fonction de rappel est comme convention em>. Vous passez toujours
null code> comme premier argument dans une fonction de rappel. Voir cette référence li>
- 2ème argument détermine ce que le fichier doit être nommé dans le dossier code> de destination code>.
Donc, ici, vous pouvez spécifier n'importe quelle fonction, ce qui peut vous rappeler un nom de fichier unique em> à chaque fois. strong> li> ul> puisque vous utilisez mangouste ... Je pense que ce serait mieux si vous implémentez votre référence
Uniquefilename () code> à l'aide de la méthode
Mongoose code> dans votre schéma (dans lequel vous souhaitez enregistrer le chemin de fichier) et l'appeler votre gestionnaire de route. En savoir plus P> P>
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: 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 () CODE> Fonction et supprimez le fichier avec
nom_fichier code> Nom
Pas besoin. Parce que vous utilisez des horodatages. P> li>
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: p>
Voir aussi NODEJS System System Doc P> OL>
Le nom de fichier code> 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 code>
@Rashomon, donc, si je désigne le nom comme UUID, je peux atteindre ce nom de l'appel d'API
req.file.fieldname code>?
J'ai un exemple de travail devant moi et son stocké dans une propriété appelée
nom de fichier code> oui. Ce n'est pas exactement pareil, car j'utilise Multidupload