0

I have an endpoint as /images/upload and it's responsible for uploading photos to our s3 bucket, using multer and multer-s3. When I send the photo from postman everything works fine and the photo gets uploaded to s3 bucket, but when I try to upload photo from my react-native frontend the photo appears as weird characters in the body of the request.

I don't know what am I doing incorrectly. my request is like

   const formData = new FormData();
   formData.append('file', {
       uri: 'some uri',
       name: 'name',
       type: 'image/jpeg',
       });
   try {
       const responseAxios = await axios({
          url: 'http://127.0.0.1:8080/api/v1/images/upload',
          headers: {
             Authorization: 'my token',
             'Content-Type': 'multipart/form-data',
            },
          method: 'POST',
          data: formData,
          });
    } catch (error) {
        console.log('the error -> ', error.message)
    }

and my endpoint code is as bellow.

/images/router.js

const { Router } = require('express');
const passport = require('passport');

const router = new Router();
const controller = require('./controller');
const multer = require('multer');
const multers3 = require('multer-s3');

const AWS = require('aws-sdk');
const config = require('../../config');

AWS.config.update({
  accessKeyId: config.s3.accessKey,
  secretAccessKey: config.s3.secretKey,
  region: config.s3.bucketRegion,
});
const s3 = new AWS.S3();

const upload = multer({
  storage: multers3({
    s3: s3,
    bucket: (process.env.S3_BUCKET),
    acl: 'public-read',
    metadata: function (req, file, cb) {
      cb(null, { fieldName: file.fieldname });
    },
    key: function (req, file, cb) {
      cb(null,  file.originalname);
    },
  }),
});

router
  .route('/upload')
  .post(
    passport.authenticate('token', { session: false }),
    upload.single('file'),
    (...args) => controller.uploadToS3(...args),
  );

module.exports = router;

/images/controller.js

const imageFacade = require('./facade');

class ImageController {  
  uploadToS3(req, res, next) {
    imageFacade.uploadToS3(req)
      .then((result) => {
        res.send({ success: true, result });
      }).
      catch((err) => {
        res.status(400).send({ success: false, message: err })
      });
  }
}

module.exports = new ImageController(imageFacade);

/images/facade.js

const Promise = require('promise');

class ImageFacade {
  uploadToS3(req) {
    return new Promise((resolve, reject) => {
      console.log('body file is ', req.body.file)
      resolve({
        url: req.file.location,
        name: req.file.key,
        type: req.file.mimetype,
        size: req.file.size,
      });
    });
  }
}

module.exports = new ImageFacade();

0 Answers0