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

Emm*_*mma 10 configuration image-uploading amazon-s3 amazon-web-services node.js

到目前为止有什么工作:

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

问题:

如何配置图像,以便亚马逊将其作为公共服务并使用适当的内容类型(image/jpeg或image/png)?现在它默认为private和(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);
        }
      });
    });
  }
Run Code Online (Sandbox Code Playgroud)

Emm*_*mma 29

这是回答我问题的最佳来源,虽然我最初没有找到答案: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'到params,转向:

var params = {Key: file.name, Body: ''};
Run Code Online (Sandbox Code Playgroud)

var params = {Key: file.name, Body: '', ContentType: file.mimetype, ACL: 'public-read'};
Run Code Online (Sandbox Code Playgroud)

编辑:

您可以只允许特定的mimetypes,例如:'image/jpg','image/jpeg','image/png','image/gif'等,而不是提供文件的mimetype.

  • 注意ContentType属性!我正在撕扯我的头发,直到我注意到我使用Content-Type作为属性名称. (5认同)
  • 这个解决方案不会允许某人上传任何类型的文件吗?据我所知,这并不限于图像。 (2认同)

小智 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);
        }
    })
});
Run Code Online (Sandbox Code Playgroud)