如何将带有签名URL的文件上传到S3?
我尝试了以下操作:
const AWS = require('aws-sdk');
const s3 = new AWS.S3({ accessKeyId: "", secretAccessKey: "" });
const url = s3.getSignedUrl("putObject", {
Bucket: "SomeBucketHere",
Key: "SomeNameHere",
ContentType: "binary/octet-stream",
Expires: 600
});
但是当我尝试通过以下步骤与Postman上传时,出现SignatureDoesNotMatch
错误。
binary
(单选按钮),选择文件,然后选择要上传的文件我可以确认IAM权限不是这里的问题。我可以完全访问Bucket。
怎么了?如何测试我的签名URL?
答案 0 :(得分:1)
这个问题曾经使我无比痛苦。
我要做的就是向邮递员请求添加标头。
标题: Content-Type = binary/octet-stream
更改此设置后,文件将成功上传。
希望这可以为别人省去很多麻烦。
答案 1 :(得分:0)
不确定是否有帮助,但是我相信您需要传递签名版本。
在python中,您有类似的东西:
import boto3 as boto3
from botocore.client import Config
...
s3_client = boto3.client('s3', config=Config(signature_version='s3v4'))
url = s3_client.generate_presigned_url(
ClientMethod='put_object',
Params={
'Bucket': bucket,
'Key': key,
},
ExpiresIn=60
)
print url
所以Javascript中的等效项是:
var AWS = require('aws-sdk');
var s3 = new AWS.S3({
signatureVersion: 'v4',
});
exports.handler = (event, context, callback) => {
const url = s3.getSignedUrl('putObject', {
Bucket: '**\[YOUR-S3-BUCKET\]**',
Key: 'mykey',
Expires: 10,
});
callback(null, url);
};
来源:
Presigned URL for S3 Bucket Expires Before Specified Expiration Time
Using pre-signed URLs to upload a file to a private S3 bucket