【问题标题】:Reference S3 file upload name in new mongoDB object在新的 mongoDB 对象中引用 S3 文件上传名称
【发布时间】:2020-12-11 08:51:09
【问题描述】:

我正在将图像从表单上传到我的 S3 存储桶。提交表单时,它会创建一个新的 mongoDB 对象。我正在使用key: function (req, file, cb) {cb(null, Date.now().toString())}, 为上传提供唯一的名称。我的问题是,当我保存新的 mongoDB 对象时,我不确定如何引用唯一的 S3 密钥。

我承认这可能是一个愚蠢的问题,但我对 mongoDB/mongoose 不是很有经验,这是我第一次使用 S3。

如果有任何意见或建议,我将不胜感激

// productController.js

// if errors on form

else {
        let product = new Product({
          business: req.body.businessName,
          productName: req.body.productName,
          category: req.body.productCategory,
          price: req.body.productPrice,
          description: req.body.productDescription,
          website: req.body.website,
          imageURL: "https://mybucket.s3-us-west-2.amazonaws.com/" + '???'
        }); 
        product.save(function (err) {
          if (err) {
            console.log(err)
            return next(err);
          }
          res.redirect("/list-product");

        });
      }

使用这个上传我的图片:

// uploadController.js

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



aws.config.update({
  secretAccessKey: process.env.SECRETACCESSKEY,
  accessKeyId: process.env.ACCESSKEYID,
  region: "us-west-2",
});
const s3 = new aws.S3();

const fileFilter = (req, file, cb) => {
  if (file.mimetype === "image/jpeg" || file.mimetype === "image/png") {
    cb(null, true);
  } else {
    cb(new Error("Invalid format, only JPG and PNG"), false);
  }
};  

const upload = multer({
  fileFilter: fileFilter,
  storage: multerS3({
    s3: s3, 
    bucket: "mybucket",
    acl: "public-read",
    metadata: function (req, file, cb) {
      cb(null, { fieldName: file.fieldname });
    },
    key: function (req, file, cb) {
      console.log(file);
      cb(null, Date.now().toString());
    },
  }),
});

module.exports = upload;


还有我的路线:

// routes.js

let upload = require('../controllers/uploadController')
const singleUpload = upload.single("image");

// post list product page
router.post('/list-product', singleUpload, listController.list__post)

【问题讨论】:

    标签: node.js mongodb amazon-web-services amazon-s3 mongoose


    【解决方案1】:

    我不是这方面的专家,但我可以考虑一个解决方案:

    我看到您在上传时首先处理请求,因此您可以在请求中保存密钥的值,而不是在创建文件时直接在图像名称上使用 Date.now()

    所以你应该这样做: req.imageName = new Date.now().toString() 并在名称中使用 req.imageName 更改名称的创建

    然后在处理请求的下一个控制器中,您可以访问提供给函数的对象“req”上的名称。

    注意:如果您对不同客户端有并发请求,则 new Date.now() 不是一个好的唯一键,如果您同时有太多请求,则很有可能获得相同的数字。

    注意 2:我可以考虑 uuid 以获得更好的唯一键,我不太了解其他可以解决该问题的库。

    【讨论】:

    • 非常感谢您帮助我,您的解决方案确实有效!生病看看找到一个uuid库。再次感谢!
    • 欢迎您,当您需要将数据从中间件传递到控制器时很有用。
    • 嘿丹尼尔,我在处理多个文件时遇到了问题。我试图使用你在这个问题上发给我的逻辑,但我很困惑。如果您想看一看,我将不胜感激! stackoverflow.com/questions/65348117/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-14
    • 1970-01-01
    • 2018-06-22
    • 2018-04-10
    • 2021-05-28
    相关资源
    最近更新 更多