【问题标题】:How to specify upload directory in multer-S3 for AWS-S3 bucket?如何在 multer-S3 中为 AWS-S3 存储桶指定上传目录?
【发布时间】:2017-10-17 03:41:15
【问题描述】:

我正在使用 express + multer-s3 将文件上传到 AWS S3 服务。

使用以下代码,我能够将文件上传到 S3 Bucket,但直接在存储桶中。

我希望将它们上传到存储桶内的文件夹中。

我找不到这样做的选项。

这里是代码

AWS.config.loadFromPath("path-to-credentials.json");
var s3 = new AWS.S3();

var cloudStorage = multerS3({
    s3: s3,
    bucket: "sample_bucket_name",
    contentType: multerS3.AUTO_CONTENT_TYPE,
    metadata: function(request, file, ab_callback) {
        ab_callback(null, {fieldname: file.fieldname});
    },
    key: function(request, file, ab_callback) {
        var newFileName = Date.now() + "-" + file.originalname;
        ab_callback(null, newFileName);
    },
});
var upload = multer({
    storage: cloudStorage
});

router.post("/upload", upload.single('myFeildName'), function(request, response) {
    var file = request.file;
    console.log(request.file);
    response.send("aatman is awesome!");
});

【问题讨论】:

    标签: node.js amazon-s3 multer-s3


    【解决方案1】:

    还有另一种不错的方法!写入存储桶名称后,在其中添加文件夹名称,并在前面加上斜线。

    const multerS3Config = multerS3({
        s3: s3,
        bucket: process.env.AWS_BUCKET_NAME + '/<your-folder-name>', //put a slash infront
        metadata: function (req, file, cb) {
            cb(null, { fieldName: file.fieldname });
        },
        key: function (req, file, cb) {
        cb(null, Date.now() + file.originalname)
        }  
    });
    

    【讨论】:

      【解决方案2】:

      我对动态目标路径的解决方案。希望这对某人有帮助!

      const fileUpload = function upload(destinationPath) {
        return multer({
          fileFilter: (req, file, cb) => {
            const isValid = !!MIME_TYPE_MAP[file.mimetype];
            let error = isValid ? null : new Error("Invalid mime type!");
            cb(error, isValid);
          },
          storage: multerS3({
            limits: 500000,
            acl: "public-read",
            s3,
            bucket: YOUR_BUCKET_NAME,
            contentType: multerS3.AUTO_CONTENT_TYPE,
            metadata: function (req, file, cb) {
              cb(null, { fieldName: file.fieldname });
            },
            key: function (req, file, cb) {
              cb(null, destinationPath + "/" + file.originalname);
            },
          }),
        });
      };
      
      
      
      module.exports = fileUpload;
      

      如何调用:

      router.patch(
        "/updateProfilePicture/:userID",
        fileUpload("user").single("profileimage"),
        usersControllers.updateProfilePicture
      );
      

      “profile image”是body中传递的文件的key。
      “用户”是目标文件夹的路径。您可以传递任何路径,包括文件夹和子文件夹。所以这会将我的文件放在我的存储桶内一个名为“用户”的文件夹中。

      【讨论】:

        【解决方案3】:

        S3 并不总是有文件夹(请参阅http://docs.aws.amazon.com/AmazonS3/latest/UG/FolderOperations.html)。它将通过在文件名中添加以 / 分隔的字符串来模拟文件夹。

        例如

        key: function(request, file, ab_callback) {
            var newFileName = Date.now() + "-" + file.originalname;
            var fullPath = 'firstpart/secondpart/'+ newFileName;
            ab_callback(null, fullPath);
        },
        

        【讨论】:

        • 非常感谢!!像魅力一样工作...... :)
        • 有没有办法使“第一部分/第二部分”前缀动态化?我用过 req.params.destination 但没有运气
        • @HerveTribouilloy 绝对。第一部分/第二部分只是字符串。您可以根据需要生成它们。如果您没有看到您所期望的,请确保您的参数中确实有一个值。
        • 是的,我的问题是我似乎无法向 multer/multerS3 使用的请求参数发送参数。我还读到 multer 不能很好地处理参数,所以我想知道您是否有更多这方面的经验,感谢您的反馈
        • 谢谢,问题是由于 POST 请求数据没有被解析。我还没有找到解析它们的方法,而是找到了一种解决方法,即使用查询参数(要在 POST 数据中上传的文件,其他参数在查询中)。感谢您的支持
        猜你喜欢
        • 1970-01-01
        • 2022-01-23
        • 1970-01-01
        • 2015-12-07
        • 2017-09-17
        • 1970-01-01
        • 1970-01-01
        • 2013-09-16
        • 2017-12-23
        相关资源
        最近更新 更多