簡體   English   中英

使用 Python 請求將文件放入 S3

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM