que para aws python amazon-s3 boto

python - para - Cómo cambiar los metadatos en un objeto en Amazon S3



sdk para python (7)

Si ya ha subido un objeto a un depósito de Amazon S3, ¿cómo se modifican los metadatos con la API? Es posible hacerlo en la consola de administración de AWS, pero no está claro cómo se podría hacer mediante programación. Específicamente, estoy usando la API boto en Python y, al leer la fuente, está claro que usar key.set_metadata solo funciona antes de que se cree el objeto, ya que solo afecta a un diccionario local.


En Java, puede copiar el objeto en la misma ubicación. Aquí los metadatos no se copiarán mientras se copia un Objeto. Debe obtener los metadatos del original y configurar para copiar la solicitud. Este método es más recomendable para insertar o actualizar metadatos de un objeto de Amazon S3

ObjectMetadata metadata = amazonS3Client.getObjectMetadata(bucketName, fileKey); ObjectMetadata metadataCopy = new ObjectMetadata(); metadataCopy.addUserMetadata("yourKey", "updateValue"); metadataCopy.addUserMetadata("otherKey", "newValue"); metadataCopy.addUserMetadata("existingKey", metadata.getUserMetaDataOf("existingValue")); CopyObjectRequest request = new CopyObjectRequest(bucketName, fileKey, bucketName, fileKey) .withSourceBucketName(bucketName) .withSourceKey(fileKey) .withNewObjectMetadata(metadataCopy); amazonS3Client.copyObject(request);


Para establecer metadatos en archivos S3, simplemente no proporcione la ubicación de destino ya que solo la información de origen es suficiente para establecer los metadatos.

final ObjectMetadata metadata = new ObjectMetadata(); metadata.addUserMetadata(metadataKey, value); final CopyObjectRequest request = new CopyObjectRequest(bucketName, keyName, bucketName, keyName) .withSourceBucketName(bucketName) .withSourceKey(keyName) .withNewObjectMetadata(metadata); s3.copyObject(request);`


Para la primera respuesta, es una buena idea incluir el tipo de contenido original en los metadatos, por ejemplo:

key.set_metadata(''Content-Type'', key.content_type)




aquí está el código que funcionó para mí. Estoy usando aws-java-sdk-s3 versión 1.10.15

ObjectMetadata metadata = new ObjectMetadata(); metadata.setContentType(fileExtension.getMediaType()); s3Client.putObject(new PutObjectRequest(bucketName, keyName, tempFile) .withMetadata(metadata));


Parece que debe sobrescribir el objeto consigo mismo, utilizando un "Objeto PUT (Copiar)" con una x-amz-metadata-directive: REPLACE encabezado además de los metadatos. En boto, esto se puede hacer así:

k = k.copy(k.bucket.name, k.name, {''myKey'':''myValue''}, preserve_acl=True)

Tenga en cuenta que cualquier metadato que no incluya en el diccionario anterior se eliminará. Entonces, para preservar los viejos atributos, deberá hacer algo como:

k.metadata.update({''myKey'':''myValue''}) k2 = k.copy(k.bucket.name, k.name, k.metadata, preserve_acl=True) k2.metadata = k.metadata # boto gives back an object without *any* metadata k = k2;

Casi me pierdo esta solución, que se insinúa en la introducción a una pregunta con un título incorrecto que en realidad se trata de un problema diferente al de esta pregunta: Cambiar contenido: disposición del objeto S3 existente