使用 multer-s3 nodejs 将图像上传到亚马逊 s3

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/40494050/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-02 17:49:04  来源:igfitidea点击:

Uploading image to amazon s3 using multer-s3 nodejs

node.jsfile-uploadamazon-s3multermulter-s3

提问by mBlaze

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

我正在尝试使用 将图像上传到 amazon s3 multer-s3,但出现此错误:

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

类型错误:预期 opts.s3 为对象 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?

为什么我收到这个错误?

回答by Zeeshan Hassan Memon

Completeand working Node Cheat | Upload to s3 using multer-s3available.

完整且有效的节点作弊| 使用可用的multer-s3上传到s3

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,
        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',1), function (req, res, next) {
    res.send("Uploaded!");
});

app.listen(3000, function () {
    console.log('Example app listening on port 3000!');
});

For complete repo:

对于完整的回购

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

克隆节点作弊express_multer_s3node app然后运行npm install express body-parser aws-sdk multer multer-s3.

Happy Helping!

乐于助人!

回答by Anjum....

@V31 has answered very well still I want to add my 2 cents.

@V31 回答得很好,我仍然想加我的 2 美分。

I believe in keeping one responsibility into one file, for better code organization and debugging purpose.

我相信将一个责任放在一个文件中,以便更好地组织代码和调试。

I have created a file for uploading upload.js.

我创建了一个用于上传的文件upload.js

require('dotenv').config();
const AWS = require('aws-sdk');
const multer = require('multer');
const multerS3 = require('multer-s3');

const s3Config = new AWS.S3({
    accessKeyId: process.env.AWS_IAM_USER_KEY,
    secretAccessKey: process.env.AWS_IAM_USER_SECRET,
    Bucket: process.env.AWS_BUCKET_NAME
  });

const fileFilter = (req, file, cb) => {
    if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png') {
        cb(null, true)
    } else {
        cb(null, false)
    }
}

// this is just to test locally if multer is working fine.
const storage = multer.diskStorage({
    destination: (req, res, cb) => {
        cb(null, 'src/api/media/profiles')
    },
    filename: (req, file, cb) => {
        cb(null, new Date().toISOString() + '-' + file.originalname)
    }
})

const multerS3Config = multerS3({
    s3: s3Config,
    bucket: process.env.AWS_BUCKET_NAME,
    metadata: function (req, file, cb) {
        cb(null, { fieldName: file.fieldname });
    },
    key: function (req, file, cb) {
        console.log(file)
        cb(null, new Date().toISOString() + '-' + file.originalname)
    }
});

const upload = multer({
    storage: multerS3Config,
    fileFilter: fileFilter,
    limits: {
        fileSize: 1024 * 1024 * 5 // we are allowing only 5 MB files
    }
})

exports.profileImage = upload; 

Which is imported inside my routes routes.js

这是在我的路线中导入的 routes.js

const express = require('express');

const ProfileController = require('../profile/controller');
const { profileImage } = require('../utils/upload.js'); 

 const routes = (app) => {
    const apiRoutes = express.Router();

    apiRoutes.use('/profile', profileRoutes);
    profileRoutes.post('/',profileImage.single('profileImage'), ProfileController.saveProfile);

    app.use('/api', apiRoutes);

 }

module.exports = routes

Postman screen shot for post body

Postman 帖子正文的屏幕截图

enter image description here

在此处输入图片说明

回答by V31

s3needs to be an object to be passed. According to the docs, the object needs to be like this:

s3需要是要传递的对象。根据文档,对象需要是这样的:

var upload = multer({
  storage: multerS3({
    s3: s3,
    bucket: 'some-bucket',
    metadata: function (req, file, cb) {
      cb(null, {fieldName: file.fieldname});
    },
    key: function (req, file, cb) {
      cb(null, Date.now().toString())
    }
  })
})

MulterS3 Docs

MulterS3 文档

回答by Hassan Masood

/*** Using Multer To Upload Image image is uploading */

/*** 使用 Multer 上传图片 图片正在上传 */

const fileStorage = multer.diskStorage({
  destination: function(req, file, cb) {
    cb(null, "./public/uploads");
  },
  filename: function(req, file, cb) {
    cb(null, file.originalname);
  }
});

/** AWS catalog */

aws.config.update({
  secretAccessKey: process.env.SECRET_KEY,
  accessKeyId: process.env.ACCESS_KEY,
  region: "us-east-1"
});

const s3 = new aws.S3();
const awsStorage = multerS3({
  s3: s3,
  bucket: process.env.BUCKET_NAME,
  key: function(req, file, cb) {
    console.log(file);
    cb(null, file.originalname);
  }
});

const upload = multer({
  storage: awsStorage(),
  /** in above line if you are using local storage in ./public/uploads folder than use
   ******* storage: fileStorage,
   * if you are using aws s3 bucket storage than use
   ******* storage: awsStorage(),
   */
  limits: { fileSize: 5000000 },
  fileFilter: function(req, file, cb) {
    checkFileType(file, cb);
  }
});
app.post("/user-profile-image", upload.single("profile"), (req, res, err) => {
  try {
    res.send(req.file);
  } catch (err) {
    res.send(400);
  }
});

const checkFileType = (file, cb) => {
  const filetypes = /jpeg|jpg|png|gif/;
  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: Images Only!");
  }
};

回答by web_developer

I was passing S3 to mutler in caps, like

我把 S3 大写地传递给 mutler,就像

S3: {object}

Changing it to small s3 works for me:-

将其更改为小型 s3 对我有用:-

s3: {object}