Uploading image to amazon s3 using multer-s3 nodejs

前端 未结 6 1913
遥遥无期
遥遥无期 2020-12-04 15:45

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

6条回答
  •  既然无缘
    2020-12-04 16:36

    I just want to add my cents,

    There are many comments in all answers like how to get public URL after uploading and S3 response object and lets see implementation and cases,

    // INITIALIZE NPMS
    var AWS = require('aws-sdk'),
    multer = require('multer'),
    multerS3 = require('multer-s3'),
    path = require('path');
    
    // CONFIGURATION OF S3
    AWS.config.update({
        secretAccessKey: '***********************************',
        accessKeyId: '****************',
        region: 'us-east-1'
    });
    
    // CREATE OBJECT FOR S3
    const S3 = new AWS.S3();
    
    // CREATE MULTER FUNCTION FOR UPLOAD
    var upload = multer({
        // CREATE MULTER-S3 FUNCTION FOR STORAGE
        storage: multerS3({
            s3: S3,
            acl: 'public-read',
            // bucket - WE CAN PASS SUB FOLDER NAME ALSO LIKE 'bucket-name/sub-folder1'
            bucket: 'bucket-name',
            // META DATA FOR PUTTING FIELD NAME
            metadata: function (req, file, cb) {
                cb(null, { fieldName: file.fieldname });
            },
            // SET / MODIFY ORIGINAL FILE NAME
            key: function (req, file, cb) {
                cb(null, file.originalname); //set unique file name if you wise using Date.toISOString()
                // EXAMPLE 1
                // cb(null, Date.now() + '-' + file.originalname);
                // EXAMPLE 2
                // cb(null, new Date().toISOString() + '-' + file.originalname);
    
            }
        }),
        // SET DEFAULT FILE SIZE UPLOAD LIMIT
        limits: { fileSize: 1024 * 1024 * 50 }, // 50MB
        // FILTER OPTIONS LIKE VALIDATING FILE EXTENSION
        fileFilter: function(req, file, cb) {
            const filetypes = /jpeg|jpg|png/;
            const extname = filetypes.test(path.extname(file.originalname).toLowerCase());
            const mimetype = filetypes.test(file.mimetype);
            if (mimetype && extname) {
                return cb(null, true);
            } else {
                cb("Error: Allow images only of extensions jpeg|jpg|png !");
            }
        }
    });
    

    There are three cases, if we want to retrieve files res object from S3 after upload:

    Case 1: When we are using .single(fieldname) method it will return file object in req.file

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

    Case 2: When we are using .array(fieldname[, maxCount]) method it will return file object in req.files

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

    Case 3: When we are using .fields(fields) method it will return file object in req.files

    app.post('/upload', upload.fields([
      { name: 'avatar', maxCount: 1 },
      { name: 'gallery', maxCount: 8 }
    ]), function (req, res, next) {
        console.log('Uploaded!');
        res.send(req.files);
    });
    

提交回复
热议问题