2016-06-10 81 views
3

我想使用boto3來更新S3存儲桶中現有對象的內容類型,但我該如何做,而不必重新上傳文件?如何使用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?

相關的問題:那裏似乎

回答

6

不存在任何方法,這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,在評論中指出由佐敦菲利普斯:

s3 = boto3.resource("s3") 
object = s3.Object(bucket_name, key) 
object.copy_from(CopySource={'Bucket': bucket_name, 
          'Key': key}, 
       MetadataDirective="REPLACE", 
       ContentType="application/pdf") 
+1

複製也在資源中。 [docs](http://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Object.copy_from) –

+0

@JordonPhillips更好,謝謝!如果你想補充說,作爲答案,我會接受 – leo

-2

嘗試

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

由文檔here的描述下。

+0

不,內容類型不能像這樣設置(請參閱上面的鏈接問題),因此這個問題... – leo

+0

我認爲它可以是。請看看這些文檔。 https://boto3.readthedocs.io/en/latest/guide/migrations3.html#key-metadata – Darwesh

+0

boto3中稱爲「元數據」的東西是您可以添加到S3對象的自定義元數據,所以不,內容鍵入,對不起。我同意參數的命名可能會令人困惑,但 – leo

相關問題