[英]PUTing files into S3 using Python requests
我有這個 URL 是使用generate_url(300, 'PUT', ...)
方法生成的,我想使用請求庫將文件上傳到其中。
這是我一直在使用的代碼: requests.put(url, data=content, headers={'Content-Type': content_type})
,我也嘗試了一些變體,但我得到的錯誤總是相同的。
我每次都從 S3 收到 403 - SignatureDoesNotMatch
錯誤,我做錯了什么?
使用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)
如果您的存儲桶不是公共寫入,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哈希計算。
我遇到了同樣的問題。
簽名似乎有一個簽名的 header “主機”,因此它也必須包含在您發送的請求中。
s3_client = boto3.client(
's3',
region_name=<region>,
config=Config(signature_version='s3v4')
)
kwargs = {
"ClientMethod": "put_object",
"Params": {
"Bucket": <bucket>,
"Key": <file key>,
},
"ExpiresIn": 3600,
"HttpMethod": "PUT",
}
s3_client.generate_presigned_url(**kwargs)
with open(<my_file>, "rb") as f:
data = f.read()
response = requests.put(url, data=data, headers={"host": "<bucket>.s3.amazonaws.com"})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.