我正在创建一个聊天应用程序,并希望将其他聊天服务器图像保存到S3存储桶中。
我有一个简单的HTML表单,允许我选择将服务器名称,类别和图像URL保存到mongoDB。该图像也应该上传到我的S3存储桶中,但是在我的Node控制台中,我收到以下错误:
我正在使用multers3和aws-sdk。
为什么会出现此错误?我在SO上看过其他示例,但是没有一种解决方案可以解决我的问题。
dashboard.ejs :
Error: connect ENETUNREACH 169.254.169.254:80 at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1097:14)
awsUpload.js
<div class="container">
<form action="/dashboard" method="post" enctype="multipart/form-data">
<input type="text" name="server" placeholder="Server Name">
<input type="text" name="category" placeholder="Category">
<button class="btn btn-lg btn-outline-info" type="button" id="uploadBtn">Upload Image</button>
<input type="file" name="upload" id="uploadInput" style="display: none">
<button>Add Server</button>
</form>
</div>
admin.js
const AWS = require('aws-sdk');
const multer = require('multer');
const multerS3 = require('multer-s3');
AWS.config.update({
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
region: process.env.AWS_REGION
});
const s0 = new AWS.S3();
const upload = multer({
storage: multerS3({
s3: s0,
bucket: 'chapp-images-server',
acl: 'public-read',
metadata: function(req, file, cb){
cb(null, {fieldName: file.fieldname});
},
key: function(req, file, cb){
console.log(file);
cb(null, file.originalname);
}
}),
rename: function (fieldname, filename) {
return filename.replace(/\W+/g, '-').toLowerCase();
}
});
exports.Upload = upload;
我想我已经包含了所有相关文件,如果更容易的话,我可以将链接上传到我的GitHub存储库中。
我已经尝试了以下方法:
module.exports = function(formidable, Server, aws){
return {
setRoute: function(router){
router.get('/dashboard', this.adminPage);
router.post('/uploadFile', aws.Upload.any(), this.uploadFile);
router.post('/dashboard', this.adminPostPage);
},
adminPage: function(req, res){
res.render('admin/dashboard');
},
adminPostPage: function(req, res){
const newClub = new Server();
newClub.name = req.body.server;
newClub.category = req.body.category;
newClub.image = req.body.upload;
newClub.save((err) => {
res.render('admin/dashboard');
})
},
uploadFile: function(req, res) {
const form = new formidable.IncomingForm();
form.on('file', (field, file) => {
});
form.on('error', (err) => {
});
form.on('end', () => {
});
form.parse(req);
}
}
};
编辑: .env :
enctype="multipart/form-data"
答案 0 :(得分:0)
我设法通过在S3存储桶中添加Bucket Policy
来解决此问题。
对于其他可能有类似问题的人,这是我的做法:
Account ID
,该标签应位于页面顶部Permissions
标签,然后选择Bucket Policy
按钮Policy generator
链接,该链接位于存储桶策略编辑器窗口下方将打开一个包含某些选项的新窗口,并填写以下字段:
Select Type of Policy: S3 Bucket Policy
Principal: arn:aws:iam::<YOURACCOUNTID>:root
Actions: Tick the "All Actions" tickbox next to it
Amazon Resource Name (ARN): Your S3 ARN which can be found in the Bucket Policy window near the top. It will look similar to this -> arn:aws:s3:::BUCKETNAME
输入所有值后,您应该可以按“添加语句”按钮
Bucket policy editor
文本区域中,然后按保存您现在应该可以访问S3存储桶。