2016-06-10 9 views
3

Ich möchte den Inhaltstyp eines vorhandenen Objekts in einem S3-Bucket mithilfe von Boto3 aktualisieren, aber wie mache ich das, ohne die Datei erneut hochladen zu müssen?Wie lege ich den Inhaltstyp eines vorhandenen S3 Schlüssels mit boto3 fest?

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 

Gibt es eine Methode dafür habe ich in Boto3 verpasst?

Verwandte Fragen:

Antwort

6

Es scheint keine Methode dafür in boto3 zu existieren, aber man kann die Datei selbst zu überschreiben, kopieren.

Um dies zu tun, den AWS niedrigen Level-API durch boto3 verwenden, wie dies tun:

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) 

Die MetadataDirective="REPLACE" stellt sich heraus, für S3 benötigt werden, um die Datei zu überschreiben, andernfalls erhalten Sie eine Fehlermeldung erhalten 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. sagen .

Oder Sie können copy_from verwenden, wie Jordon Phillips in den Kommentaren darauf hingewiesen:

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

Kopie ist auch in der Ressource. [docs] (http://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Object.copy_from) –

+0

@JordonPhillips Noch besser, danke! Wenn Sie das als Antwort hinzufügen möchten, akzeptiere ich das – leo

-2

versuchen

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

wie beschrieben here durch die Dokumentation.

+0

Nein, 'Content-Type' kann nicht so eingestellt werden (siehe die oben stehenden Fragen), daher diese Frage ... – leo

+0

Ich denke es kann Sein. Bitte schauen Sie sich diese Dokumente an. https://boto3.readthedocs.io/en/latest/guide/migrations3.html#key-metadata – Darwesh

+0

Die Sache namens "Metadaten" in Boto3 sind die benutzerdefinierten Metadaten, die Sie zu einem S3-Objekt hinzufügen können, also nein, nicht Inhalt Typ, Entschuldigung. Ich stimme zu, dass die Benennung des Parameters kann verwirrend sein, obwohl – leo