user4386126
user4386126

Reputation: 1245

Change destination of uploaded file with Multer

I am using Multer to upload some files and I would like to upload files to different folders depending on which user uploads them.

This is my code:

server.js

app.use('/', require('./routes'));
app.use(express.static('public'));

routes/index.js

var teacher = require('./teachers.js');

router.post('/teachers/{id}/upload', teacher.uploadAvatar);

routes/teachers.js

var multer      = require('multer');
var upload      = multer({ dest: 'public/uploads/teacher/' }).single('avatar');

uploadAvatar: function(req, res) {
    upload(req, res, function(err) {
        console.log(req.body);
        console.log(req.file);

        if(err) {
            return res.end("Error uploading file.");
        }
        res.end("File is uploaded");
    });
}

Files are uploaded perfectly fine but I would like to create separate folders for each user. Folder name should be user's id. I can access user's id like this:

teacherId: req.params.id

Ideally, I also plan to rename uploaded file.

Upvotes: 0

Views: 4237

Answers (3)

Andrija Gajic
Andrija Gajic

Reputation: 382

You can use express router and in every route initialize new upload instance and use it as a middleware, example:

const createPost = require('./routes/createPost');

app.use('/create-post', createPost);

And then in routes/createPost.js:

const express = require('express');
const router = express.Router();
const multer = require('multer');

const upload = multer({ dest: 'uploads/new_destination' });

router.post('/', upload.single('imageToPost'), async(req, res) => {
    res.sendStatus(201);
});

module.exports = router;

Upvotes: 0

AntiVirus
AntiVirus

Reputation: 140

From what I know, you can't change the destination dynamically. You can move the files once they are updated. Please find the below issue and answer posted in github,

https://github.com/expressjs/multer/issues/39

Upvotes: 0

Mustafa Mamun
Mustafa Mamun

Reputation: 2651

var multer  = require('multer')
var mkdirp = require('mkdirp');
uploadAvatar: function(req, res) {

mkdirp('public/uploads/' + req.params.id , function(err) { 
var upload      = multer({ dest: 'public/uploads/' + req.params.id }).single('avatar');
upload(req, res, function(err) {
    console.log(req.body);
    console.log(req.file);

    if(err) {
        return res.end("Error uploading file.");
    }
    res.end("File is uploaded");
});

});
}

That should work

Upvotes: 3

Related Questions