2016-11-08 266 views
4

我想Amazon S3的使用multer-s3来上传图片,但我得到这个错误:上传图像到Amazon S3使用multer-S3的NodeJS

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

这是我的服务器代码:

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

为什么我得到这个错误?

回答

9

完成和工作Node Cheat | Upload to s3 using multer-s3可用。

代码:

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

有关完整的回购

克隆节点骗express_multer_s3,运行之后npm install express body-parser aws-sdk multer multer-s3node app

快乐帮助!

+1

为什么没有一百万个这样的答案喜欢?这帮助了我。谢谢。您可能想要更新:'aws.config.update({0} {0}} {0}}}}签名版本:'v4',因为我收到一个错误,并且这样做解决了它。 – Somename

+1

真的很有帮助。 –

4

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

+0

哪里可以提供以上的accesskeyId – mBlaze

+0

@mBlaze:您需要使用aws sdk使用var s3 = new aws.S3({/ * ... * /})创建一个s3对象。你可以找到更多的信息使用链接http://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/loading-node-credentials-json-file.html – V31

+0

@mBlaze:只是想知道如果你能解决你的问题。如果是,那么请标记接受的答案。 – V31