3

我有这个使用该generate_url(300, 'PUT', ...)方法生成的 URL,我想使用请求库将文件上传到其中。

这是我一直在使用的代码:requests.put(url, data=content, headers={'Content-Type': content_type}),我也尝试了一些变体,但我得到的错误总是一样的。

我每次都从 S3 收到 403 -SignatureDoesNotMatch错误,我做错了什么?

4

2 回答 2

1

使用boto3,这是如何生成上传 url 和其中的PUT一些数据:

session = boto3.Session(aws_access_key_id="XXX", aws_secret_access_key="XXX")
s3client = session.client('s3')
url = s3client.generate_presigned_url('put_object', Params={'Bucket': 'mybucket', 'Key': 'mykey'})

requests.put(url, data=content)
于 2016-07-26T14:07:39.193 回答
0

如果您的存储桶不是公开写入,S3 需要身份验证令牌。请检查令牌。

我建议你直接使用boto

bucket.new_key()
key.name = keyname
key.set_contents_from_filename(filename, {"Content-Type": content_type})
# optional if file public to read
bucket.set_acl('public-read', key.name)

另请检查您是否添加了 Content-Length 标头。它是必需的并参与身份验证哈希计算。

于 2012-07-20T14:02:44.473 回答