使用Python请求将文件放入S3

时间:2012-07-20 13:57:21

标签: python amazon-s3 boto python-requests

我已经使用generate_url(300, 'PUT', ...)方法生成了此网址,并且我想使用requests library将文件上传到其中。

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

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

2 个答案:

答案 0 :(得分:1)

使用boto3,这是如何生成上传网址和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)

答案 1 :(得分: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标头。这是必需的,并参与auth哈希计算。