Search code examples
node.jsfile-uploadamazon-s3multermulter-s3

Uploading image to amazon s3 using multer-s3 nodejs


I am trying to upload an image to amazon s3 using multer-s3, but I am getting this error:

TypeError: Expected opts.s3 to be object node_modules/multer-s3/index.js:69:20

This is my server code:

var upload = multer({
    storage: s3({
        dirname: '/',
        bucket: 'bucket',
        secretAccessKey: 'key',
        accessKeyId: 'key',
        region: 'us-west-2',
        filename: function (req, file, cb) {
            cb(null, file.originalname); 
        }
    })
});

app.post('/upload', upload.array('file'), function (req, res, next) {
    res.send("Uploaded!");
});

Why I am getting this error?


Solution

  • [Update Mar 2022] It works perfectly fine till-date and now also shows the uploaded file public URL as well.

    Complete and working Node Cheat | Upload to s3 using multer-s3 available.

    Code:

    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,
            acl: 'public-read',
            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 form
    app.get('/', function (req, res) {
        res.sendFile(__dirname + '/index.html');//index.html is inside node-cheat
    });
    
    //use by upload form
    app.post('/upload', upload.array('upl', 25), function (req, res, next) {
        res.send({
            message: "Uploaded!",
            urls: req.files.map(function(file) {
                return {url: file.location, name: file.key, type: file.mimetype, size: file.size};
            })
        });
    });
      
    app.listen(3000, function () {
        console.log('Example app listening on port 3000!');
    });
    

    For complete repo:

    Clone node-cheat express_multer_s3, run node app followed by npm install express body-parser aws-sdk multer multer-s3.

    Happy Helping!