Node js - 在上传时配置 aws s3 图像

Posted

技术标签:

【中文标题】Node js - 在上传时配置 aws s3 图像【英文标题】:Node js - Configuring aws s3 images on upload 【发布时间】: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);
        
      );
    );
  

【问题讨论】:

【参考方案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);
        
    )
);

【讨论】:

以上是关于Node js - 在上传时配置 aws s3 图像的主要内容,如果未能解决你的问题,请参考以下文章

使用适用于 Node.js 的 AWS 开发工具包将二进制文件上传到 S3

AWS S3 上传的图像已部分加载

从 url 下载文件并将其上传到 AWS S3 而不保存 - node.js

Node.js S3 上传器问题

从 node.js 将图像上传到 s3 存储桶

AWS Lambda 制作视频缩略图