如何使用nodejs将图像上传到s3存储桶?

时间:2019-01-18 10:06:03

标签: node.js amazon-web-services aws-sdk multer multer-s3

我是aws的新手。我想使用multer将节点js中的图片上传到s3存储桶。

我已按照youtube上的教程进行操作,但因该错误而陷入困境。

https://www.youtube.com/watch?v=ASuU4km3VHE&t=1047s

TypeError:无法读取未定义的属性“位置”错误。(POSTMAN)

请帮助我解决问题。谢谢您的帮助

file_upload.js

const express = require("express");
const app = express();
const upload = require("./file_upload");

const singleUpload = upload.single("image");

app.post("/image-upload", function(req, res) {
  singleUpload(req, res, function(err, some) {
    if (err) {
      return res.status(422).send({
        errors: [{ title: "Image Upload Error", detail: err.message }]
      });
    }
    return res.json({ imageUrl: req.file.location });
  });
});


app.listen(3000, () => {
  console.log("Listening on Port 3000");
});

file_upload_router.js

const multer = require("multer");
const multerS3 = require("multer-s3");
const aws = require("aws-sdk");

aws.config.update({
  secretAccessKey: "Your_ACCESS_KEY",
  accessKeyId: "YOUR_ACCESS_KEY_ID",
  region: "" // region of your bucket
});

const s3 = new aws.S3();

const upload = multer({
  storage: multerS3({
    s3: s3,
    bucket: "upload-image-node-test",
    acl: "public-read",
    metadata: function(req, file, cb) {
      cb(null, { fieldName: "TESTING_META_DATA!" });
    },
    key: function(req, file, cb) {
      cb(null, Date.now().toString());
    }
  })
});

module.exports = upload;

我还进行了以下更改:-

阻止新的公共ACL并上传公共对象(推荐)”为False。

“也删除通过公共ACL授予的公共访问权限(推荐)”为False。

我需要获取一个以imageUrl作为键并将时间戳记作为文件名的JSON响应,但出现以下错误:

TypeError:无法读取未定义的属性“位置””

2 个答案:

答案 0 :(得分:2)

您正在访问请求对象上不存在的location的{​​{1}}属性。 Node / Express不会自动处理此问题。

如果您想访问file对象上的file(而无需编写自定义处理程序),那么您需要安装req模块并将其用作中间件

body-parser

这假定您的Web表单包含名称为const bodyParser = require('body-parser'); app.use(bodyParser.urlencoded({ extended: false })); 的字段。

答案 1 :(得分:0)

您能解决吗,但我将给所有人找到一个解决方案。

您设置为禁止所有人访问(存储桶设置)对所有用户都是关闭。

单击链接,然后选择“您的商店”,然后单击“权限”,然后选择“阻止公共访问” 链接桶:https://s3.console.aws.amazon.com/s3/buckets/?region=us-east-1

enter image description here