使用aws-sdk和Nodejs上传图片到S3

10

我想上传图片到亚马逊网络服务器,为此我正在使用nodejs的aws-sdk。

我能够将图片上传到S3存储桶,但是当我点击URL以访问它们时,我收到了拒绝访问的错误。

这是我的配置:

     var AWS = require('aws-sdk');

     //aws credentials
     AWS.config = new AWS.Config();
     AWS.config.accessKeyId = "<access_key>";
     AWS.config.secretAccessKey = "<secret_key>";
     AWS.config.region = "ap-southeast-1";
     AWS.config.apiVersions = {
        "s3": "2006-03-01"
     }

    var s3 = new AWS.S3();

    var bodystream = fs.createReadStream(req.files.pic.path);

    var params = {
        'Bucket': '<bucket_name>',
        'Key': 'uploads/images/' + req.files.pic.name,
        'Body': bodystream,
        'ContentEncoding': 'base64', 
        'ContentType ': 'image/jpeg'
     };

     //also tried with s3.putObject
     s3.upload(params, function(err, data){
        console.log('after s3 upload====', err, data);
     }) 

图片上传成功,但它们的内容类型是application/octet。我认为存在一些权限问题,因为当我添加新权限时,我可以下载图片,但无法查看图片。

你能告诉我这个配置有什么问题,并且我想知道s3.upload和s3.putObject方法之间的区别。

1个回答

4
为了指定Content-Type头部,您需要定义Metadata部分:
var params = {
    'Bucket': '<bucket_name>',
    'Key': 'uploads/images/' + req.files.pic.name,
    'Body': bodystream,
    'ContentEncoding': 'base64', 
    Metadata: {
        'Content-Type': 'image/jpeg'
    }

 };

如果我尝试以这种方式指定内容类型,就会收到此错误{ [SignatureDoesNotMatch: The request signature we calculated does not match the signature you provided. Check your key and signing method.] message: 'The request signature we calculated does not match the signature you provided. Check your key and signing method.', code: 'SignatureDoesNotMatch', time: Fri Oct 30 2015 12:55:30 GMT+0530 (IST), statusCode: 403, retryable: false, retryDelay: 30 } - Bhushan Goel
@BhushanGoel 我已经修复了代码,忘记了content-type中的破折号。 - Vsevolod Goloviznin
但是我该如何设置权限呢?我仍然收到访问被拒绝的错误提示。 - Bhushan Goel
您的用户可以修改此内容吗? - Vsevolod Goloviznin
让我们在聊天中继续这个讨论 - Bhushan Goel
显示剩余3条评论

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