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)
Puede cambiar los metadatos sin volver a filtrar el objeto mediante el comando de copia. Vea esta pregunta: ¿Es posible cambiar los encabezados en un objeto S3 sin descargar todo el objeto?
Si desea que sus metadatos se almacenen de forma remota, use set_remote_metadata
Ejemplo: key.set_remote_metadata({''to_be'': ''added''}, [''key'', ''to'', ''delete''], {True/False})
La implementación está aquí: https://github.com/boto/boto/blob/66b360449812d857b4ec6a9834a752825e1e7603/boto/s3/key.py#L1875
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