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!');});