2016-02-11 2 views
0

Я пытаюсь переименовать файл изображения, загруженный с помощью multer по параметрам запроса.node.js multer переименовать загруженный файл

Вот мой код:

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!' }); 
}); 

Он отлично работает, но мне было интересно, если существует что-то чище и проще с функцией multer переименования.

Он уже пытался что-то вроде этого:

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!' }); 
}); 

Но это не работает, потому что REQ не заселена еще (не определен).

Я использую httpie проверить свой код с помощью следующей команды:

http.exe -f POST http://localhost:8080/upload/171284 [email protected]:\....\cat.jpg 

Можно ли использовать переименовать функцию multer, чтобы делать то, что я делаю с фс? Или есть лучший способ?

Благодарим вас за отзыв.

Томас

EDIT

Мой новый код с помощью 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!' }); 
}); 

Это выдает ошибку:

Error: Route.post() requires callback functions but got a [object Object] 

ответ

0

Ther не находится в Multer конструктору не rename, Insted из этого, t здесь filename в 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 no filename is given, each file will be given a random name that doesn't include any file extension.

+0

Спасибо @Festo. Но как я могу поместить его в свой router.route .post? Мне пришлось обновить до последней версии multer для использования diskStorage, и теперь мой код выше некорректен. – Thomi

+0

@Thomi Трудно сказать, в чем проблема без вашего обновленного кода. – Festo

+0

Я только что редактировал свой пост. – Thomi