2017-01-12 2 views
1

Я пытаюсь загрузить изображение в файловую систему с помощью Multer. Пожалуйста, обратите внимание на соответствующие данные в моем маршруте:Multer не проходит по экспресс-маршруту

const 
    .. 
    multer = require('multer'), 
    ..; 

const storage = multer.diskStorage({ 
    destination: function (req, file, callback) { 
     callback(null, './uploads'); 
    }, 
    filename: function (req, file, callback) { 
     callback(null, req.params.id + file.originalname); 
    } 
    }), 
    upload = multer({storage: storage}).single('profilePic'); 

router.put(
    '/:id', 
    middleware.isLoggedIn, 
    (req, res, next) => { 

    User 
     .findByIdAndUpdate(
     req.params.id, req.body.user, 
     (err, updatedUser) => { 
      if (err) { 
      return req.flash('error', err.message); 
      } 

      upload(req, res, (err) => { 
      if (err) { 
       eval(locus); 
       return req.flash('error', err.message); 
      } 
      updatedUser = req.body.user; 
      eval(locus); 

      //redirect show page 
      res.redirect('/dashboard/profile/' + req.params.id + '/edit'); 
      }); 
     }); 
    }); 

module.exports = router; 

Когда я смотрю на updatedUser первое, что я вижу, это { profilePic: 'data:image/jpeg;base64,....}, что я делаю неправильно? Это даже не обновление страницы теперь, когда у меня есть функция загрузки здесь. То, что я действительно хочу сделать, это получить назначение для работы на s3, но мне нужно сначала сохранить это.

+0

Что вы используете на передней стороне ... Я имею в виду angular.js или что-то еще ???. –

+0

Nope. Просто ejs и jquery. –

ответ

2

Таким образом, это самый простой пример загрузки изображения с помощью multer:

var express = require('express') 
var multer = require('multer') 
var app = express() 

var storage = multer.diskStorage({ 
    // define where the file should be uploaded, else it will be uploaded to the system temp dir 
    destination: function (req, file, cb) { 
    // ./uploads should be created beforehand 
    cb(null, './uploads') 
    }, 
    // define "filename", else a random name will be used for the uploaded file 
    filename: function (req, file, cb) { 
    cb(null, file.fieldname + '-' + file.originalname) 
    } 
}) 

var upload = multer({ storage: storage }) 

// pic is the name of image field in the form 
app.put('/profile', upload.single('pic'), function (req, res, next) { 
    console.log(req.file) 
    res.send('Uploaded') 
}) 

app.listen(3000) 

А вот пример, curl команду, чтобы загрузить изображение из файловой системы в вышеуказанном приложении:

curl -X PUT -F '[email protected]/projects/eg/foto.png' localhost:3000/profile 

Убедитесь, что пример работает нормально, чтобы вы поняли, как multer обрабатывает файлы, и что проблема не с multer.

Это говорит о том, что User.findByIdAndUpdate, по-видимому, хранит данные изображения в качестве кодировки base64 где-то; Я понятия не имею, к чему подключается User.findByIdAndUpdate. Он находится за пределами домена multer.

Возможно, кто-то на нашем канале Gitter (https://gitter.im/expressjs/express) может что-то предложить. Присоединяйтесь к нам.

+0

Несомненно, User.findByIdAndUpdate - это мангуста. Однако теперь, когда я смотрю на это свежими глазами, у меня есть идея. –

+0

Я понял это вчера, и хотел отметить ваш ответ как приемлемый. Спасибо. –

Смежные вопросы