通过预签名URL使用cURL将文件上传到S3

3

我将获取一个预签名URL来上传S3 bucket中的文件。

这是curl命令:

curl -v -T ./dansero.jpg 'https://ss-files-dev.s3.ap-southeast-2.amazonaws.com/dansero.jpg\?AWSAccessKeyId\=AKIAIT6VM43PPNS43Y7Q\&Expires\=1531973770\&Signature\=hNvG5rnICkk58mMBLeMgHGDZ93c%3D'

那让我出现了错误:
<Error>
  <Code>AccessDenied</Code>
  <Message>Access Denied</Message>
</Error>

这里是我生成 Node.js 预签名 URL 的代码。
var AWS = require('aws-sdk');

const s3 = new AWS.S3({

  accessKeyId: 'aaa',
  secretAccessKey: 'bbb+oeyjn8zGANuDyCIY',
  region: 'ap-southeast-2'
});

const params = {
  Bucket: 'ss-files-dev',
  Key: 'dansero.jpg'  
};

});

s3.getSignedUrl('putObject', params, function(err, urlsign) {
  if (err) console.log(err);
  console.log(urlsign);
});

那么我的问题出在URL生成还是cURL呢? 谢谢。

1
从您的URL中删除所有反斜杠\。您正在使用单引号'字符串向curl提供URL,因此这些不需要,实际上也没有意义。 - Michael - sqlbot
1个回答

1
我看不到签名请求部分,请确保获取了用于放置对象的签名URL。这是我的脚本中的工作代码:
 s3.getSignedUrl('putObject', params, function(err, urlsign) {
            if (err) console.log(err);
            var output = {
                url: urlsign
            };
            cb(null, output);
        });

尝试通过简单的 put 请求将对象放入您的存储桶中,如下所示:

                        var req = http.request({
                            hostname: 's3.amazonaws.com',
                            port: 80,
                            path:{YOURPRESIGNEDURL}.replace('https://s3.amazonaws.com', ''),
                            method: 'PUT',
                        }, function(res) {

最后,确保以下几点:

1-用户策略和正确的IAM密钥。您应该有权限放置此类对象:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt14546345345",
            "Effect": "Allow",
            "Action": [
                "s3:Put*"
            ],
            "Resource": [
                "arn:aws:s3:::myBucket/*"
            ]
        }
    ]
}

2- 我认为你应该在curl请求中传递-X PUT。


嗨@reza,谢谢回复,我已经更新了我的代码,我遇到了签名请求问题,现在问答相同的问题,谢谢。 - manuelBetancurt

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