我有这个使用该generate_url(300, 'PUT', ...)
方法生成的 URL,我想使用请求库将文件上传到其中。
这是我一直在使用的代码:requests.put(url, data=content, headers={'Content-Type': content_type})
,我也尝试了一些变体,但我得到的错误总是一样的。
我每次都从 S3 收到 403 -SignatureDoesNotMatch
错误,我做错了什么?
我有这个使用该generate_url(300, 'PUT', ...)
方法生成的 URL,我想使用请求库将文件上传到其中。
这是我一直在使用的代码:requests.put(url, data=content, headers={'Content-Type': content_type})
,我也尝试了一些变体,但我得到的错误总是一样的。
我每次都从 S3 收到 403 -SignatureDoesNotMatch
错误,我做错了什么?
使用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)
如果您的存储桶不是公开写入,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 标头。它是必需的并参与身份验证哈希计算。