我只是想要添一些我的意见,
在所有的回答中有很多评论,比如如何在上传后获取公共URL和S3响应对象,我们来看看实现和案例。
var AWS = require('aws-sdk'),
multer = require('multer'),
multerS3 = require('multer-s3'),
path = require('path');
AWS.config.update({
secretAccessKey: '***********************************',
accessKeyId: '****************',
region: 'us-east-1'
});
const S3 = new AWS.S3();
var upload = multer({
storage: multerS3({
s3: S3,
acl: 'public-read',
bucket: 'bucket-name',
metadata: function (req, file, cb) {
cb(null, { fieldName: file.fieldname });
},
key: function (req, file, cb) {
cb(null, file.originalname);
}
}),
limits: { fileSize: 1024 * 1024 * 50 },
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 !");
}
}
});
如果我们想要在上传后从S3检索res
对象,有三种情况:
情况1:当我们使用.single(fieldname)
方法时,它将在req.file
中返回文件对象。
app.post('/upload', upload.single('file'), function (req, res, next) {
console.log('Uploaded!');
res.send(req.file);
});
情况2: 当我们使用.array(fieldname[, maxCount])
方法时,它将返回文件对象在req.files
中。
app.post('/upload', upload.array('file', 1), function (req, res, next) {
console.log('Uploaded!');
res.send(req.files);
});
案例 3: 当我们使用.fields(fields)
方法时,它会在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);
});
aws.config.update({ signatureVersion: 'v4',
因为我遇到了一个错误,这样做解决了它。 - Somename