J'ai cette route express avec le téléchargement de fichiers multer. Lorsque le téléchargement est terminé, je voudrais encoder l'image en base64 et l'envoyer avec une réponse.Node.js: télécharger Multer avec promesse?
Cependant quand je le fais comme ceci, le code essaye d'exécuter l'encodage base64 avant que le dossier soit créé au dossier.
Modifier: Ajout stockage & fonctions de téléchargement
const storage = multer.diskStorage({
destination: (req, file, callback) => {
if (!fs.existsSync('./uploads')) {
fs.mkdirSync('./uploads');
}
let path = './uploads';
callback(null, path);
},
filename(req, file, cb) {
let fileExt = file.originalname.substring(file.originalname.lastIndexOf('.')).toLowerCase();
if (!imageFilter(fileExt)) {
return false;
} else {
cb(null, file.originalname);
}
},
onError: function (err, next) {
console.log('error', err);
next(err);
},
});
const upload = multer({
storage,
limits: {
fileSize: 1000 * 1000 * 2 // 2 MB
}
}).single('file');
router.post('/upload', function (req, res) {
var directory = 'uploads';
fs.readdir(directory, (err, files) => {
if (err) throw err;
for (var file of files) {
fs.unlink(path.join(directory, file), err => {
if (err) throw err;
});
}
});
upload(req, res, function (err) {
if (err) {
return res.status(404).json({
success: false,
message: 'File is too large. (Max 2MB)'
});
}
var file = req.file;
var base64str = base64_encode('./uploads/' + file.originalname);
return res.status(200).json({
success: true,
url: 'http://' + ip.address() + ':' + constants.PORT + '/api/uploads/' + file.originalname,
image: 'data:image/png;base64,' + base64str
});
});
});
Quelle serait la façon la plus intelligente pour atteindre le bon ordre des opérations. Peut-être des promesses ou async/attendre?
Pourriez-vous s'il vous plaît ajouter le code de fonction 'upload'? –
Oh oui, désolé. –
Quel type de stockage avez-vous implémenté? – Tolsee