Файл изображения не загружается / не создается с помощью multer - PullRequest
1 голос
/ 29 марта 2020

Я создаю сайт блога, все работает нормально, кроме image upload на моем Post. post работает на 100%, но когда я присоединяю image, он не получает uploaded or created, я не знаю, что я делаю неправильно, пожалуйста, мне нужна помощь. Я начал изучать node и express несколько месяцев go. Пожалуйста, помогите мне.

внутри индекса. js файл

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

const Schema = mongoose.Schema;
const ObjectId = Schema.ObjectId;

Моя схема

const BlogPost = new Schema({
 author: ObjectId,
 title: String,
 body: String,
 profileimage: String,
 date: { type: Date, default: Date.now },
 comments: [{ type: Schema.Types.ObjectId, ref: 'Comment' }]
});
var Post = mongoose.model('Post', BlogPost);



router.post("/makepost", upload.single('profileimage'), (req, res) => {

 var myData = new Post(req.body);
 if(req.file) {
   console.log('Uploading File....');
   var profileimage = req.file.filename;
   console.log(profileimage)
 }else {
   console.log('No File Uploaded....');
  var profileimage = 'noimage.jpg';
 }
 myData.save()
 .then(item => {
 res.redirect('/posts');
})
.catch(err => {
 res.status(400).send("unable to save to database");
});
});

и вот мой взгляд

<form action='/makepost' method='post' enctype="multipart/form-data">
 <p>Title: <input type='text' name='title' </p>
 <p>Content: <input type='text' name='body' </p>
 <div class="form-group"> <label>Profile Image</label><input class="form-control" 
   name="profileimage" type="file" />
 <p><input type='submit' value='post'></p>

1 Ответ

1 голос
/ 29 марта 2020

Поскольку вы используете multer с дисковым хранилищем, вам необходимо прочитать образ из временного местоположения, прежде чем сохранять его с mon goose. Кроме того, я бы изменил тип данных изображения в схеме mon goose на buffer.

Что-то вроде этого должно работать (обратите внимание, что я использую async / await вместо обещаний напрямую):

router.post("/makepost", upload.single('profileimage'), async (req, res) => {

    const newPost = new Post(req.body);
    if (req.file) {         
        const imgBuffer = await fs.promises.readFile(req.file.path); // TODO add error handling
        newPost.profileimage = imgBuffer;
    }
    try {
        await myData.save();
        res.redirect('/posts');
    }catch(err) {
        res.status(400).send("unable to save to database");
    }
});

// mongoose schema
...
profileimage: Buffer,
...

Вы также можете сохранить изображение в виде строки в кодировке Base64 и сохранить в схеме тип данных string.

РЕДАКТИРОВАТЬ:

Как обсуждалось в комментариях - измените тип данных profileimage обратно на string, так как profileimage будет просто содержать путь к файлу.

router.post("/makepost", upload.single('profileimage'), async (req, res) => {

    const newPost = new Post(req.body);
    if (req.file) {         
        newPost.profileimage = req.file.path;
    }
    ...

Добавьте промежуточное программное обеспечение express для обслуживания изображений, например,

app.use(express.static('./uploads'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...