[英]How do I set the Content-Type of an existing S3 key with boto3?
我想使用 boto3 更新 S3 存儲桶中現有對象的 Content-Type,但我該怎么做,而無需重新上傳文件?
file_object = s3.Object(bucket_name, key)
print file_object.content_type
# binary/octet-stream
file_object.content_type = 'application/pdf'
# AttributeError: can't set attribute
有沒有我在boto3中錯過的方法?
相關問題:
在 boto3 中似乎不存在任何方法,但您可以復制文件以覆蓋自身。
要通過 boto3 使用 AWS 低級 API 執行此操作,請執行以下操作:
s3 = boto3.resource('s3')
api_client = s3.meta.client
response = api_client.copy_object(Bucket=bucket_name,
Key=key,
ContentType="application/pdf",
MetadataDirective="REPLACE",
CopySource=bucket_name + "/" + key)
MetadataDirective="REPLACE"
原來是 S3 覆蓋文件所必需的,否則您將收到一條錯誤消息,指出This copy request is illegal because it is trying to copy an object to itself without changing the object's metadata, storage class, website redirect location or encryption attributes.
.
或者您可以使用copy_from
,正如 Jordon Phillips 在評論中指出的那樣:
s3 = boto3.resource("s3")
object = s3.Object(bucket_name, key)
object.copy_from(CopySource={'Bucket': bucket_name,
'Key': key},
MetadataDirective="REPLACE",
ContentType="application/pdf")
除了@leo 的回答之外,如果您的對象上有自定義元數據,請小心。 為了避免副作用,我建議在 leo 的代碼中添加Metadata=object.metadata
否則您可能會丟失以前的自定義元數據:
s3 = boto3.resource("s3")
object = s3.Object(bucket_name, key)
object.copy_from(
CopySource={'Bucket': bucket_name, 'Key': key},
Metadata=object.metadata,
MetadataDirective="REPLACE",
ContentType="application/pdf"
)
您可以使用 boto3 中的upload_file
函數並使用ExtraArgs
參數指定內容類型,這將使用內容類型覆蓋現有文件,查看此參考
檢查以下示例:
import boto3
import os
client = boto3.client("s3")
temp_file_path = "<path_of_your_file>"
client.upload_file(temp_ticket_path, <BUCKET_NAME>, temp_file_path, ExtraArgs={'ContentType': 'application/pdf'})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.