簡體   English   中英

如何使用 boto3 設置現有 S3 密鑰的 Content-Type?

[英]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'})

嘗試

file_object.put(ContentType='<specific_content/type>')

正如這里的文件所述。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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