Node.js - 配置 AWS S3 图片上传

21

到目前为止有效的方法:

使用此函数,我将上传到我的服务器的图像发送到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);
        }
      });
    });
  }
2个回答

61

虽然我最初没有在这里找到答案,但这是回答我的问题的最佳来源: 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'};

编辑:

不要提供文件的MIME类型,您可以仅允许特定的MIME类型,例如:'image/jpg'、'image/jpeg'、'image/png'、'image/gif'等。


编辑#2: 原始问题是关于上传配置的,但这对一些查看此内容的人也可能很重要:

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


5
小心ContentType属性!直到我注意到自己使用了Content-Type作为属性名称之前,我一直非常苦恼。 - martinp999
2
这个解决方案不会允许任何类型的文件上传吗? 据我所知,这不会限制为仅适用于图像。 - corysimmons
是的,我认为你说得对,现在回过头来看......我会更新ContentType。 - heckascript
1
这个答案刚刚拯救了我。 - Gaurav Sharma
尽管在许多地方它出现为元数据,但如果您将其放置为{"Key":key, "Body": body, "Metadata": {"Content-Type": "mime/type"}},它是不起作用的。 - Vitim.us
在我的情况下,MIME类型位于file.type中。 - Zakher Masri

6
我已经添加了以下的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);
        }
    })
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接