Multer-s3 Download empty files to mobile

I use angular and multer-s3 to upload files from an angular application to a node server. Everything works well on the desktop, but for some reason, when I try to upload a photo through my iPhone 7, the downloaded file is damaged. I use the same image and view the same stream on both devices, but I get different results, so I assume it is due to mobile?

Here is the warning I get when I try to open the S3 file on my mobile device

The file "1519398514215-test.png" could not be opened because it is empty.

Here is my code

var aws = require('aws-sdk');
var path = require('path');
var path3 = path.join(__dirname, "../config/config-aws.json");
var multer = require('multer');
var multerS3 = require('multer-s3');
var request = require('request');

aws.config.loadFromPath(path3);
var s3 = new aws.S3();
var fileName = '';
var uploadM = multer({
  storage: multerS3({
    s3: s3,
    bucket: 'XXXX',
    acl: 'public-read',
    metadata: function (req, file, cb) {
      cb(null, {fieldName: file.fieldname + '.png'});
    },
    key: function (req, file, cb) {
      fileName =  Date.now().toString() + "-" + file.originalname + '.png' ;
      cb(null, fileName)
    }
  })
});



router.post('/', uploadM.array('photos', 3), function(req,res) {
  if (res.error) {
    console.log(error.stack);
    return res.status(400).json({
      message: "Error",
      error: res.error
    });
  }
  const url = 'https://s3-us-west-2.amazonaws.com/XXXX/' + fileName;
  return res.status(200).json({
    fileName: url
  });
});

And here is my client side

sendImage() {
  const formData: FormData = new FormData();

  this.removeObjectFromCanvas('polygon');


  if (!fabric.Canvas.supports('toDataURL')) {
    alert('This browser doesn\'t provide means to serialize canvas to an image');
  } else {
    // window.open(this.canvas.toDataURL('png'));
    const image = new Image();
    image.src = this.canvas.toDataURL('png');



        const blob = this.dataURItoBlob(image.src);

        const file = new File([blob], 'test.png');


        formData.append('photos', file, 'test');



        this.postFile(formData);
      }


    }

    postFile(file) {
      this.fileService.post(file)
      .subscribe(data => {

      }, error => {
        console.log(error);
      });
    }

UPDATE **********

So you can debug on your mobile device. It looks like there is data in the buffer I'm sending. My first thought was that the buffer was not sent.

enter image description here

**** . , , - formData ? , , . ...

***** , . ?

enter image description here

, formData node, , .

***

, . , multer-s3 , , , . , formData , - multer-s3, ?

**** UPDATE , fabricjs . , , , , , .

**** contentType multer, 503 . .

aws.config.loadFromPath(path3);
var file1;
var s3 = new aws.S3();
var fileName = '';
var uploadM = multer({
  storage: multerS3({
    s3: s3,
    bucket: 'rent-z',
    acl: 'public-read',
    contentType: function (req, file, cb) {
      cb(null, 'image/png');
    },
    metadata: function (req, file, cb) {
      console.log(file);
      cb(null, {fieldName: file.fieldname});
    },
    key: function (req, file, cb) {
      fileName =  Date.now().toString() + "-" + file.originalname;
      file1 = file;
      cb(null, fileName)
    }
  })
}).array('photos', 1);



router.post('/', function(req,res) {
  uploadM(req, res, function (err) {
    if (err) {
      console.log(err);
      return res.status(400).json({
        message: "Error uploading to multer",
        error: err
      });
    }
  console.log('worked');

  if (res.error) {
    console.log(error.stack);
    return res.status(400).json({
      message: "Error",
      error: res.error
    });
  }
  // fs.readFile(req.body, function (err, data) { 
  const url = 'https://s3-us-west-2.amazonaws.com/rent-z/' + fileName;
  return res.status(200).json({
    fileName: url
  });
  // });
  })

});

multer-s3 mime-,

**** 4

96 , . . , , . , :

  • sendImage

  • dataUri, blob

  • blob , formData​​p >

  • Data nodejs, multer-s3 s3

  • 7. , .

, - , .

+4
1

"" , . , , ", API/SaaS/, ". , , , .

- , googling " " . $25 - $50/month api. , ( , ) . SaaS-, ; SaaS-, , S3 , S3 api ; SaaS-, , , - , .. , , , iPhone 47.

" SaaS " , . , , //, . ES6: fileUploads.js

upload. ? API [fileupload SaaS X]. SaaS X SaaS Y, : fileUpload.js .

+3

Source: https://habr.com/ru/post/1694053/


All Articles