2

Please I am try to make post and get request from postman that will save the path of the image to mongodb not binary. I successfully posted the data to mongodb that includes form-data(text and file) but the file is a buffer. I want it to be a binary data, so that when I want to get it back I won't get a binary data. text is posting successfully, and am getting the required text back but image is sending binary and am getting binary back which is very bad idea.

Please I need help.

//POST Request
app.post('/request', upload.single('images'), async function(req, res){
    const requestBody = {
        name: req.body.name,
        description: req.body.description,
        images: req.file.buffer
    }
    const request = new Request(requestBody)

    try{
        await request.save()
        res.status(201).send()

    }catch(e){
        res.status(400).send(e)
    }

})

//GET request
app.get('/request', async function(req, res){

    try{
        const requests = await Request.find({})
        // console.log(requests)
        res.send()

    }catch(e){
        res.status(500).send()
    }
})
Samson Ugwu
  • 104
  • 2
  • 11
  • You can first store user uploads in a directory and then store their absolute path in the db. – Hasan Jan 21 '21 at 10:42
  • When deployed to production what will happen to the local directory @ Hassan – Samson Ugwu Jan 21 '21 at 10:43
  • That's the catch, if you are storing just the URL of the image, then you need the images on the machine too. Meaning your production server should have the image directory (where then the images will be served on request). – Hasan Jan 21 '21 at 10:45
  • What other better ways do you think this can be achieved. @Hassan – Samson Ugwu Jan 21 '21 at 10:49
  • It really depends. I actually stored buffer for a project recently. But look here for a comprehensive answer https://stackoverflow.com/a/56419886/7660998. – Hasan Jan 21 '21 at 10:52

1 Answers1

0

You can save file path in public folder and save the path with string in mongodb

You need to create photos folder inside public folder and set it as static

mkdir -p public/photos

Then you can register path with express static

app.use(express.static(__dirname, 'public'))

and save the path which is required in db. Here you should use file's static path which is stored in req.file.path

const upload = require('multer')({ dest: path.join(__dirname, 'public/photos') })
app.post('/request', upload.single('images'), async function(req, res){
    const requestBody = {
        name: req.body.name,
        description: req.body.description,
        images: req.file.path
    }
    const request = new Request(requestBody)

    try{
        await request.save()
        res.status(201).send()

    }catch(e){
        res.status(400).send(e)
    }

})
Swapnil Soni
  • 965
  • 1
  • 10
  • 26