Simple file upload to S3 using aws-sdk and Node/Express Simple file upload to S3 using aws-sdk and Node/Express node.js node.js

Simple file upload to S3 using aws-sdk and Node/Express


You will need something like multer to handle multipart uploading.Here is an example streaming your file upload to s3 using aws-sdk.

var multer = require('multer');var AWS = require('aws-sdk');var accessKeyId =  process.env.AWS_ACCESS_KEY || "xxxxxx";var secretAccessKey = process.env.AWS_SECRET_KEY || "+xxxxxx+B+xxxxxxx";AWS.config.update({    accessKeyId: accessKeyId,    secretAccessKey: secretAccessKey});var s3 = new AWS.S3();app.use(multer({ // https://github.com/expressjs/multer  dest: './public/uploads/',   limits : { fileSize:100000 },  rename: function (fieldname, filename) {    return filename.replace(/\W+/g, '-').toLowerCase();  },  onFileUploadData: function (file, data, req, res) {    // file : { fieldname, originalname, name, encoding, mimetype, path, extension, size, truncated, buffer }    var params = {      Bucket: 'makersquest',      Key: file.name,      Body: data    };    s3.putObject(params, function (perr, pres) {      if (perr) {        console.log("Error uploading data: ", perr);      } else {        console.log("Successfully uploaded data to myBucket/myKey");      }    });  }}));app.post('/upload', function(req, res){    if(req.files.image !== undefined){ // `image` is the field name from your form        res.redirect("/uploads"); // success    }else{        res.send("error, no file chosen");    }});


Latest Answer @ Dec-2016 [New]

Use multer-s3 for multipart uploading to s3 without saving on local disk as:

var express = require('express'),    aws = require('aws-sdk'),    bodyParser = require('body-parser'),    multer = require('multer'),    multerS3 = require('multer-s3');aws.config.update({    secretAccessKey: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',    accessKeyId: 'XXXXXXXXXXXXXXX',    region: 'us-east-1'});var app = express(),    s3 = new aws.S3();app.use(bodyParser.json());var upload = multer({    storage: multerS3({        s3: s3,        bucket: 'bucket-name',        key: function (req, file, cb) {            console.log(file);            cb(null, file.originalname); //use Date.now() for unique file keys        }    })});//open in browser to see upload formapp.get('/', function (req, res) {    res.sendFile(__dirname + '/index.html');});//use by upload formapp.post('/upload', upload.array('upl',1), function (req, res, next) {    res.send("Uploaded!");});app.listen(3000, function () {    console.log('Example app listening on port 3000!');});

Latest Answer @ Mar-2016 [Old-One]

Edited 1 use multer@1.1.0 and multer-s3@1.4.1 for following snippet:

var express = require('express'),    bodyParser = require('body-parser'),    multer = require('multer'),    s3 = require('multer-s3');var app = express();app.use(bodyParser.json());var upload = multer({    storage: s3({        dirname: '/',        bucket: 'bucket-name',        secretAccessKey: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',        accessKeyId: 'XXXXXXXXXXXXXXX',        region: 'us-east-1',        filename: function (req, file, cb) {            cb(null, file.originalname); //use Date.now() for unique file keys        }    })});//open in browser to see upload formapp.get('/', function (req, res) {    res.sendFile(__dirname + '/index.html');});//use by upload formapp.post('/upload', upload.array('upl'), function (req, res, next) {    res.send("Uploaded!");});app.listen(3000, function () {    console.log('Example app listening on port 3000!');});

For complete running example clone express_multer_s3 repo and run node app.


Simple S3 File Upload Without Multer

var express = require('express')const fileUpload = require('express-fileupload');const app = express();app.use(fileUpload());var AWS = require('aws-sdk');app.post('/imageUpload', async (req, res) => {    AWS.config.update({        accessKeyId: "ACCESS-KEY", // Access key ID        secretAccesskey: "SECRET-ACCESS-KEY", // Secret access key        region: "us-east-1" //Region    })    const s3 = new AWS.S3();    // Binary data base64    const fileContent  = Buffer.from(req.files.uploadedFileName.data, 'binary');    // Setting up S3 upload parameters    const params = {        Bucket: 'BUKET-NAME',        Key: "test.jpg", // File name you want to save as in S3        Body: fileContent     };    // Uploading files to the bucket    s3.upload(params, function(err, data) {        if (err) {            throw err;        }        res.send({            "response_code": 200,            "response_message": "Success",            "response_data": data        });    });})app.listen(3000, function () {    console.log('Example app listening on port 3000!');});