【问题标题】:Node js - Configuring aws s3 images on uploadNode js - 在上传时配置 aws s3 图像
【发布时间】:2015-01-12 09:09:17
【问题描述】:

到目前为止的工作情况:

使用此功能,我正在拍摄上传到我的服务器的图像,将它们发送到 aws S3 存储桶,然后从我的机器中删除它们。这一切都很好。

问题:

如何配置图片,以便亚马逊将其作为公开的并使用正确的 Content-Type(image/jpeg 或 image/png)提供?现在它默认为私有和 (application/octet-stream)。

这是我可以在节点中配置的东西吗?还是我需要在我的 aws 控制台中执行此操作?

function sendFileToAmazon(file) {
    var s3bucket = new AWS.S3({
      params: {Bucket: 'BUCKET NAME'}
    });

    var params = {Key: file.name, Body: ''};

    fs.readFile(file.path, function(err, data) {
      if (err) throw err;
      params.Body = data;

      s3bucket.putObject(params, function(errBucket, dataBucket) {
        if (errBucket) {
          console.log("Error uploading data: ", errBucket);
        } else {
          console.log(dataBucket);
          deleteFileFromTmp(file);
        }
      });
    });
  }

【问题讨论】:

    标签: node.js amazon-web-services configuration amazon-s3 image-uploading


    【解决方案1】:

    这是回答我的问题的最佳来源,尽管我最初并没有在这里找到我的答案: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#putObject-property

    我在这里找到了答案: http://blog.katworksgames.com/2014/01/26/nodejs-deploying-files-to-aws-s3/

    您可以简单地添加: ContentType: file.mimetype, ACL: 'public-read' 给参数,转:

    var params = {Key: file.name, Body: ''};
    

    进入

    var params = {Key: file.name, Body: '', ContentType: file.mimetype, ACL: 'public-read'};
    

    编辑:

    除了提供文件的 mimetype,您只能允许特定的 mimetype,例如:“image/jpg”、“image/jpeg”、“image/png”、“image/gif”等...


    编辑 #2: 最初的问题是关于上传时的配置,但这也可能与一些查看此内容的人相关:

    https://aws.amazon.com/premiumsupport/knowledge-center/s3-allow-certain-file-types/

    【讨论】:

    • 小心 ContentType 属性!我一直在扯头发,直到我注意到我使用 Content-Type 作为属性名称。
    • 这个解决方案不允许某人上传任何类型的文件吗?据我所知,这并不局限于图像。
    • 是的,我认为你是对的,现在回头看看...我会更新 ContentType
    • 这个答案救了我
    • 即使它在很多地方都显示为元数据,但如果您将其设置为{"Key":key, "Body": body, "Metadata": {"Content-Type": "mime/type"} },则它不起作用
    【解决方案2】:

    我已添加如下 ContentType 来解决此问题。对于 png 或 jpg,即使没有 ContentType 也可以。但如果要上传 svg,则必须将 ContentType 属性发送到 S3 Bucket。

    router.post(uploadImagePath, function (request, response) {
        var form = new formidable.IncomingForm();
        form.parse(request, (err, fields, files) => {
            try {
                let ImageName = files.file.name;
                fs.readFile(files.file.path, function (err, data) {
                    let params = {
                        Bucket: 'Bucket-name',
                        Key: Date.now() + "_" + ImageName,
                        Body: data,
                        ACL: 'public-read',
                        ContentType: files.file.type
                    };
                    s3.upload(params, function (err, data) {
                        response.send(200, { key: data.key })
                    });
                });
            }
            catch (e) {
                response.send(500);
            }
        })
    });
    

    【讨论】:

      猜你喜欢
      • 2017-09-04
      • 2019-09-09
      • 1970-01-01
      • 2016-08-10
      • 1970-01-01
      • 2018-12-13
      • 1970-01-01
      • 2020-04-15
      • 2019-03-18
      相关资源
      最近更新 更多