загрузить локальный файл изображения в AWS S3 без поля ввода - PullRequest
1 голос
/ 01 июля 2019

Я создаю приложение реагирования, в котором я позволяю пользователю загружать файл PDF, а затем я преобразую файл PDF в файл JPG, сохраняю его локально, а затем загружаю в aws s3. Однако в настоящее время, когда я загружаю файл jpg в aws s3, файл не загружается как файл изображения. Я хочу загрузить локальный файл изображения в aws s3 без использования <input type="file" />

Я попытался это сделать, используя fs.readFile() с s3.upload(), но загруженный файл не является файлом изображения. Я также попытался использовать multer-s3, но для этого пользователю необходимо вручную выбрать файл изображения с помощью <input type="file" />, чего я хочу избежать.

Вот как я загружаю файл jpg:

const aws = require("aws-sdk");
const multer = require("multer");
const fs = require("fs");
const convertPdf = require("pdf-poppler");
const s3 =  new aws.S3({
  accessKeyId: "<key>",
  secretAccessKey: "<secret>",
  Bucket: "<bucketName>"
});
const storage = multer.diskStorage({ 
  destination: function(req, file, cb) {
    cb(null, path.join(__dirname + "/uploads/"));
  },
  filename: function(req, file, cb) {
    // let pdfName = "samplePDF";
    // req.body.file = pdfName;
    cb(null, file.originalname);
  }
});

const upload = multer({
  storage: storage
});  //SAVING PDF TO DISK STORAGE

router.post("/pdf", upload.single("pdf"),(req, res, next) => {
  const uploadPath = req.file.path;
  var imagePath = req.file.destination + req.file.originalname.slice(0, -4) + "-1.jpg";
  let opts = {
    format: "jpg",
    out_dir: req.file.destination,
    out_prefix: path.basename(req.file.path).slice(0, -4),
    page: null
  }
  //CONVERTING PDF TO JPG
  convertPdf.convert(uploadPath, opts).then(() => 
  {
     fs.readFile(imagePath, (err, data) => { 
      if (err) throw err;// UPLOADING FILE BUT NOT IN IMAGE FORMAT
      const params = {
         Bucket: "<bucketName>",
         Key: path.basename(imagePath),
         Body: data 
       };
      s3.upload(params, (s3Error, data) => {
        if (s3Error) throw s3Error;
        console.log(`File uploaded successfully at ${data.Location}`);
        res.json({
          image: data.key,
          location: data.Location
        });
      });
     });
    });
  });

Я ожидал, что файл изображения будет загружен, но не загруженный файл - это не файл изображения, который является проблемой. Есть ли способ загрузить локальный файл изображения в aws s3, не требуя использования поля ввода?

РЕДАКТИРОВАТЬ: оказывается, что aws s3 делает загруженный файл закрытым по умолчанию, поэтому файл не может быть прочитан, проблема решается, когда я делаю файл общедоступным.

1 Ответ

0 голосов
/ 02 июля 2019

Загруженный файл был файлом изображения, у него просто не было необходимых прав доступа. Я добавил параметр ACL: "public-read", и теперь файл отображается, как и ожидалось. Обновленный код:

  fs.readFile(imagePath, (err, data) => {
      if (err) throw err;
      const params = {
        Bucket: "flyingfishcattle",
        Key: path.basename(imagePath),
        Body: data,
        ACL: "public-read" 
      };
      s3.upload(params, (s3Error, data) => {
        if (s3Error) throw s3Error;
        console.log(`File uploaded successfully at ${data.Location}`);
        res.json({
          image: data.key,
          location: data.Location
        });
      });
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...