Ad

Unable To Succesfully Upload Images To S3 And Then View Them

I'm trying to upload images to a s3 bucket as part of the application.
index.js

  function upImg(req) {
    if(req.files.img) {
      var img = req.files.image;
      var name = Math.round(Math.random()*10000).toString(); // Returns a random 5 digit number
      if(myDB.uploadImg(img, name)) {
        return name;
      } else {
        return "";
      } 
    } else {
      return "";
  }
}

app.post('/newEV*', isLoggedIn, function(req, res) {
  var myURL = req.path.replace('/newEV', '');
  var imgPath = upImg(req);

  fetch(myURL).then(function (events){
    var myID;
    var x = 0;
    while(!myID) {
      if(!events[x]) {
        myID = x;
      } else {
        x++;
      }
    }
    myDB.newEvent(myURL, req.body.name, req.body.desc, req.body.loc, imgPath, req.body.link, req.body.cap, req.body.date, req.body.time, myID, events);
    res.redirect('/edit' + myURL);
  });

});

myDB file

function signs3(file, name)  {
    devs3();
    const s3 = new aws.S3();
    const s3Params = {
        Body: file,
        Bucket: S3_BUCKET,
        Key: name
    };

    s3.putObject(s3Params, function(err, data) {
        if(err) {
            throw err;
        } else {
            console.log("Data from putObject:" + JSON.stringify(data));  
        }
    });
}
module.exports = {

    uploadImg : function(file, name) {
        var nName = "imgs/" + name;
        console.log(nName);
        signs3(file, nName);
        return true;

   }
}

I know that the signs3 function works because I can use it in other bits of my application to upload JSON files. Whenever I post to the URL, weirdly enough I can see in the console the 'data from putObject', however what I can't see is the nName. I don't understand this, as the console.log(nName) line should be run before the other one. When I go to look at bucket, the image hasn't uploaded (despite me getting an ETag from the console), and the page does not display it as there (I know this also works because it can display images already uploaded to the bucket).

Ad

Answer

You want to do something like this, soliciting events from the Request object created when you call putObject.

const req = s3.putObject( s3Params )
req.on('success', res => {
  console.log ('upload complete! );
});
req.on ('error', res => {
  console.error (res.error');
});
req.send();

Why does this appear to work differently for small files (JSON files) and large files (images)? Because the large files take longer to upload.

Ad
source: stackoverflow.com
Ad