Reputation: 649
I am trying to rename an image file uploaded with multer by the request parameters.
Here is my code:
router.route('/upload/:userid')
.post(multer({
dest: 'uploads/'
}), function(req,res){
fs.readFile('uploads/' + req.files.file.name, function(err, data) {
fs.writeFile('uploads/' + req.params.userid + '.' + req.files.file.extension, data, function(err) {
fs.unlink('uploads/' + req.files.file.name, function(){
if(err) throw err;
});
});
});
res.json({ message: 'Successfully uploaded image!' });
});
It works great but I was wondering if it exists something cleaner and easier with multer rename function.
It already tried something like this:
router.route('/upload/:userid')
.post(multer({
dest: 'uploads/',
rename: function(req,res) {
return req.params.userid
}
}), function(req,res){
res.json({ message: 'Successfully uploaded image!' });
});
But it does not work because req is not populated yet (undefined).
I use httpie to test my code with the following command:
http.exe -f POST http://localhost:8080/upload/171284 file@D:\....\cat.jpg
Is it possible to use rename function of multer to do what I do with fs? Or is there a better way?
Thank you for your feedbacks.
Thomas
EDIT
My new code using diskStorage:
var storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, 'uploads/')
},
filename: function (req, file, cb) {
cb(null, req.params.userid + '-')
}
})
var upload = multer({ storage: storage })
router.route('/upload/:userid')
.post(multer({
storage: storage
}), function(req,res){
res.json({ message: 'Successfully uploaded image!' });
});
That throws an error:
Error: Route.post() requires callback functions but got a [object Object]
Upvotes: 1
Views: 14148
Reputation: 67
Possible to change file name that way
const crypto = require("crypto");
const multer = require('multer');
const storage = multer.diskStorage({
destination: function (req, file, callback) {
callback(null, './' + process.env.UPLOAD_PATH); // Destination folder for uploaded files
},
filename: function (req, file, callback) {
let extension = file.originalname.substring(file.originalname.lastIndexOf('.'), file.originalname.length);
callback(null, crypto.randomUUID() + extension); // rename filename
}
});
const ticketServiceFileUpload = multer({ storage: storage }).any('files');
module.exports = fileUploadService;
router
router.post('/path',fileUploadService, yourController.functionName);
Upvotes: 1
Reputation: 2290
Ther is no rename
in Multer constructor, insted of that, there is a filename
in DiskStorage.
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 })
filename
is used to determine what the file should be named inside the folder. If nofilename
is given, each file will be given a random name that doesn't include any file extension.
Upvotes: 3