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é parcb code>) : p>
- 1er argument
null code> dans la fonction de rappel est comme convention em>. Vous passez toujoursnull 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éthodeMongoose 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