Загрузить изображение через приложение реакции в базу данных mongodb с помощью mongoose - PullRequest
0 голосов
/ 04 января 2019

Я создаю приложение реагирования для найденных объектов и хочу разрешить пользователям загружать фотографии этих объектов

Я пытался отправить изображение через почтовый запрос с помощью axios на сервер mongoose, но оно не работает.

Итак, вот как я сохраняю изображение в компоненте реакции с предварительным просмотром:

handleImage(event) {
  let reader = new FileReader();
  let file = event.target.files[0];
  reader.onloadend = () => {
    this.setState({
      image: file,
      imagePreviewUrl: reader.result
    });
  }

и вот как я его отправляю:

reader.readAsDataURL(file)

axios.post("/api/putData", {
  id: idToBeAdded,
  author : "TODO", //TODO
  title: infos.title,
  type: infos.type,
  reward: this.state.reward,
  description: infos.description,
  image: infos.image,
});

Вот мой код для обработки запроса на другой стороне:

router.post("/putData", (req, res) => {
  let data = new Data();

  const { id, author, title, type, reward, description, image } = req.body;

  /*if ((!id && id !== 0) || !message) {
    return res.json({
      success: false,
      error: "INVALID INPUTS"
    });
  }*/
  data.title = title;
  data.type = type;
  data.reward = reward;
  data.description = description;
  data.author = author;
  data.id = id;
  data.image.data = image;
  data.image.contentType = 'image/png'
  data.save(err => {
    if (err) return res.json({ success: false, error: err });
    return res.json({ success: true });
  });
});

Таким образом, это изображение является частью формы, и когда я отправляю его без изображения, у меня появляется новый документ в БД без какого-либо изображения (что нормально), но когда я пытаюсь загрузить его, документ не создается.

Что я могу сделать?

1 Ответ

0 голосов
/ 04 января 2019

Вам необходимо multer на вашем сервере для обработки multipart / form-data. Вы можете хранить изображения в двух направлениях, объединяя их в каком-либо хранилище строк, которое в БД, и при необходимости декодировать эту строку. Или вы можете сохранить изображение на сервере и сохранить URL-адрес в вашей БД. Поэтому, когда вам нужно использовать изображение, вы можете использовать URL для этого.
Для загрузки изображения на сервер вы можете

import multer from 'multer'

var storage = multer.diskStorage({
  destination: function (req, file, cb) {
            var dirName =path.join(process.cwd(), './files/')
            console.log(dirName)
            if (!fs.existsSync(dirName)){
                    fs.mkdirSync(dirName);
            }
                cb(null,dirName)
        }
  },
  filename: function (req, file, cb) {
        cb(null, Date.now()+'-'+file.originalname)
  }


  })
var upload = multer({ storage: storage })

router.post("/putData",upload.single('files'), (req, res) => {
  console.log(reqs.file.destination) // image url
  console.log(JSON.parse(req.body)) // other things
})

на переднем конце добавить

handleSubmit(e){
        var fd = new FormData()
        fd.append('files',this.state.files[i][0],this.state.files[i][0].name)
        var statebody = Object.assign({},this.state,{files:null})
        fd.append('state',JSON.stringify(statebody))
        axios.post('/api/',fd)
                    .then((res)=>{
            console.log(res)
        }).catch((e)=>{
            console.log(e)
        })
    }

    handleFiles(e){
        this.setState({files:e.target.files})
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...