Node JS AWS S3 file upload. How to get public URL response

27,436

Use upload instead of putObject. It will return public url in Location key

Share:
27,436
Jack Wild
Author by

Jack Wild

Updated on February 23, 2020

Comments

  • Jack Wild
    Jack Wild about 4 years

    I'm uploading a file to Amazon S3 using the Node SDK.

    The file uploads are working fine, but I want to get the public url of the file to send back to the client.

    At the moment the response I get is:

    Successfully uploaded data { ETag: '"957cd1a335adf5b4000a5101ec1f52bf"' }
    

    Here is my code. I'm using a Node Express server, and Multer to handle uploads.

    app.use(multer({ // https://github.com/expressjs/multer
          dest: './public/uploads/', 
          limits : { fileSize:100000 },
          rename: function (fieldname, filename) {
            var time = new Date().getTime();
            return filename.replace(/\W+/g, '-').toLowerCase() + time;
          },
          onFileUploadData: function (file, data, req, res) {
            // file : { fieldname, originalname, name, encoding, mimetype, path, extension, size, truncated, buffer }
            var params = {
              Bucket: creds.awsBucket,
              Key: file.name,
              Body: data,
              ACL: 'public-read'
            };
    
            var s3 = new aws.S3()
            s3.putObject(params, function (perr, pres) {
              if (perr) {
                console.log("Error uploading data: ", perr);
              } else {
                console.log("Successfully uploaded data", pres);
              }
            });
          }
        }));
    
        app.post('/upload-image', function(req, res){
            if(req.files.file === undefined){
                res.send("error, no file chosen");
            }
        });