java grails amazon-web-services amazon-s3 jclouds

java - ¿Cómo actualizo los metadatos para un archivo de Amazon S3 existente?



grails amazon-web-services (3)

Necesito actualizar el encabezado de control de caché en todos los archivos de la nube de AmazonS3. Sin embargo, no puedo entender cómo lo hago usando la API de jclouds. Estoy usando el plugin apache jclouds. Y tengo dos respuestas relacionadas:

La primera respuesta es sugerir el uso de la clase SwiftKey Api que no está disponible en el plugin jcloud de grails. La segunda respuesta es usar AWS java sdk para el cual ya existe un complemento de ajuste de grails https://grails.org/plugin/aws-sdk pero no admite la actualización de metadatos.


A partir de marzo de 2018, la última versión de AWS SDK para .NET Core ha cambiado. Ahora utiliza programación asíncrona. Muchas de las firmas del método han cambiado. Si bien aún no puede cambiar los metadatos sin la solución de copia de objeto que Dan ha sugerido, el código para hacerlo sí lo ha hecho.

Mi solución es actualizar el objeto S3 existente con los metadatos modificados.

Lo siguiente me funciona para actualizar un solo valor de metadatos (basado en la clave y el nuevo valor). Tengo dos bucles para configurar los metadatos, pero podría optimizarse para tener solo uno:

string fileContents = string.Empty; Dictionary<string, string> fileMetaData = null; GetObjectRequest request = new GetObjectRequest { BucketName = bucketName, Key = setKeyName }; var response = await s3Client.GetObjectAsync(request); // Read the contents of the file using (var stream = response.ResponseStream) { // Get file contents TextReader tr = new StreamReader(stream); fileContents = tr.ReadToEnd(); } // Create the File Metadata collection fileMetaData = new Dictionary<string, string>(); foreach (string metadataKey in response.Metadata.Keys) { fileMetaData.Add(metadataKey, response.Metadata[metadataKey]); } // Update the metadata value (key to update, new value) fileMetaData[metaDataKeyToUpdate] = metaDataNewValue; // Update the existing S3 object PutObjectRequest putRequest1 = new PutObjectRequest { BucketName = bucketName, Key = setKeyName, ContentBody = fileContents }; // Set the metadata foreach (string metadataKey in response.Metadata.Keys) { putRequest1.Metadata.Add(metadataKey, fileMetaData[metadataKey]); } PutObjectResponse response1 = await s3Client.PutObjectAsync(putRequest1);


Es posible cambiar los metadatos realizando una copia del objeto (consulte Cómo actualizar los metadatos con el SDK de Amazon S3 ):

ObjectMetadata metadataCopy = new ObjectMetadata(); // copy previous metadata metadataCopy.addUserMetadata("newmetadata", "newmetadatavalue"); CopyObjectRequest request = new CopyObjectRequest(bucketName, existingKey, bucketName, existingKey) .withNewObjectMetadata(metadataCopy); amazonS3Client.copyObject(request);

Si esto es filosóficamente una "actualización" depende de usted decidir.


Usted no puede

Cada objeto de Amazon S3 tiene datos, una clave y metadatos. La clave del objeto (o el nombre de la clave) identifica de forma única el objeto en un contenedor. Los metadatos del objeto son un conjunto de pares nombre-valor. Puede configurar los metadatos de los objetos en el momento en que los cargue. Después de cargar el objeto, no puede modificar los metadatos del objeto. La única forma de modificar los metadatos del objeto es hacer una copia del objeto y establecer los metadatos.

http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html