Multer: неверный путь к файлу

Я добавил multer в свое приложение node js, и оно отлично работает, просто путь к изображению, который мне нужно сохранить в db, неверен. Не могу найти проблему, это, очевидно, какая-то глупая ошибка, которую я совершил.

Это моя установка для мультера

const multer = require('multer');

const storage = multer.diskStorage({
  destination: './public/images',
  filename: function(req, file, next){
      next(null, Date.now() + '-' + file.originalname);
  }
});

const upload = multer({ storage: storage});

Вот как я использую его для хранения пути

router.post('/add', upload.single('myImage'), function(req, res){
  req.checkBody('title','Title is required').notEmpty();
  //req.checkBody('author','Author is required').notEmpty();
  req.checkBody('body','Body is required').notEmpty();

  // Get Errors
  let errors = req.validationErrors();

  if(errors){
    res.render('add_article', {
      title:'Add Article',
      errors:errors
    });
  } else {
    let article = new Article();
    //var date = new Date();
    article.title = req.body.title;
    article.author = req.user._id;
    article.body = req.body.body;
    article.descript = req.body.descript;
    article.category = req.body.category;  
    article.date = getDate();
    article.time = getTime();
    article.comments = 0;   
    article.img = req.file.path;   
    console.log(req.file);
    article.save(function(err){
      if(err){
        console.log(err);
        return;
      } else {
        req.flash('success','Article Added');
        res.redirect('/');
      }
    });
  }
});

Отсюда видно, что путь неправильный, и я не могу использовать его в GET

{ _id: 5bd993756373a5182460aa2a,
  title: 'Sport 5',
  author: '5acab056708e0d1248cba6ed',
  body: 'sadddddddddddddd213',
  descript: 'dsadas',
  category: 'sport',
  date: '2018/10/31',
  time: '12:35',
  comments: 0,
  img: 'public\\images\\1540985717747-nike_logo_slogan_sport_advertising_42643_1280x1024.jpg',
  __v: 0 }

Что не так с путем? Что он начинается с public/images, что в нем \\ вместо /? Всегда нужно объяснять, каким должен быть ожидаемый результат. Потому что путь в img мне кажется правильным.

t.niese 31.10.2018 12:52

Ожидаемым результатом должна быть косая черта, а не обратная косая черта, чтобы использовать путь. Потому что с обратной косой чертой в пути я не могу ПОЛУЧИТЬ изображение .. Или я просто не знаю, как его получить?

Nedeljko Ružić 31.10.2018 13:00
img содержит путь к файловой системе, поэтому, если вы работаете в Windows, это \\, вам нужно преобразовать путь к файловой системе в URL-адрес.
t.niese 31.10.2018 13:30
1
3
1 478
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Multer работает правильно на вашем конце, вам просто нужно преобразовать системный путь в доступный URL-адрес.

Вот это вам поможет.

article.comments = 0;
let fileUrl = req.file.path.replace(/\\/g, "/").substring("public".length);
article.img = fileUrl;

Это происходит в Windows, потому что любой путь к файлу в Windows имеет только обратную косую черту, но чтобы сделать файл доступным по URL-адресу, он должен иметь косую черту спереди. Поэтому просто используйте приведенный ниже код, чтобы преобразовать всю обратную косую черту в переднюю косую черту.

const imageUrl = req.file.path.replace ("\", "/");

Другие вопросы по теме