Как загрузить изображения в корзину s3 с помощью nodejs? - PullRequest
0 голосов
/ 18 января 2019

Я новичок в AWS. Я хочу загрузить изображение из узла js, используя multer, в корзину s3.

Я следовал учебнику на YouTube, но застрял с этой ошибкой.

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

TypeError: Невозможно прочитать свойство 'location' с неопределенной "ошибкой. (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.

Мне нужно получить ответ JSON с imageUrl в качестве ключа и меткой времени в качестве имени файла, но я получаю следующую ошибку:

TypeError: Невозможно прочитать свойство 'location' undefined "

Ответы [ 2 ]

0 голосов
/ 22 мая 2019

Возможно, вы решили, но я предоставлю еще одно решение для любого, кто найдет его.

Позволяет установить для параметра Блокировать общий доступ (настройки корзины) значение Выкл. Для всех.

Нажмите ссылку и выберите«Ваш магазин» и нажмите «Разрешение», выберите «Блокировать публичный доступ». Область ссылок: https://s3.console.aws.amazon.com/s3/buckets/?region=us-east-1

enter image description here

0 голосов
/ 18 января 2019

Вы получаете доступ к location свойству file, которого нет в объекте запроса. Node / Express не обрабатывает это автоматически.

Если вы хотите иметь доступ к file на req объекте (без написания вашего собственного обработчика), вам нужно установить модуль body-parser и использовать его в качестве промежуточного программного обеспечения

const bodyParser = require('body-parser');

app.use(bodyParser.urlencoded({ extended: false }));

Предполагается, что ваша веб-форма содержит поле с именем file.

...