【问题标题】:upload local image file to aws s3 without input field在没有输入字段的情况下将本地图像文件上传到 aws s3
【发布时间】:2019-11-12 09:46:03
【问题描述】:

我正在制作一个反应应用程序,让用户上传一个 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 默认将上传的文件设为私有,这就是无法读取文件的原因,当我将文件设为公开时问题已解决。

【问题讨论】:

  • 那么上传的文件是什么?什么是扩展名?内容是否符合预期?如果不是,那是什么?
  • 该文件的扩展名为 .jpg 但它说每当我尝试从 s3 存储桶下载文件时内容已损坏所以我认为它不是图像文件
  • 在文本编辑器中打开它。你看到了什么?
  • 别介意上传的文件是图像文件,事实证明s3默认阻止文件的读取访问,一旦我启用读取访问,图像就会按预期显示

标签: reactjs image pdf amazon-s3 file-upload


【解决方案1】:

上传的文件是图像文件,只是没有正确的权限。我添加了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
        });
      });
    });

【讨论】:

    猜你喜欢
    • 2020-10-12
    • 2023-01-19
    • 1970-01-01
    • 2020-02-12
    • 2016-09-26
    • 2017-05-05
    • 2012-09-16
    • 2021-07-07
    • 2021-09-09
    相关资源
    最近更新 更多