subir example cognito aws archivos java amazon-s3

example - Búsqueda de archivos AWS S3 con Java



spring boot aws s3 (2)

Estamos utilizando una clase Java para descargar un archivo de AWS s3 bucket con el siguiente código

inputStream = AWSFileUtil.getInputStream( AWSConnectionUtil.getS3Object(null), "cdn.generalsentiment.com", filePath);

AWSFileUtil es una clase que verifica las credenciales y obtiene el inputstream de S3bucket utilizando el método getInputStream. FilePath es el archivo dentro del depósito cdn.generalsentiment.com.

Queremos escribir un método que solo pueda verificar si el archivo particular existe o no en el depósito AWS S3 y devuelve un booleano u otro valor.

Por favor sugiérame una solución para esto.

public static boolean isValidFile(AmazonS3 s3, String bucketName, String path) throws AmazonClientException { try { ObjectMetadata objectMetadata = s3.getObjectMetadata("cdn.generalsentiment.com", path); } catch (NotFoundException nfe) { nfe.printStackTrace(); } return true; }

Si el archivo existe, devuelve verdadero, de lo contrario arroja NotFoundException, que quiero capturar y devolver el resultado del método "isValidFile" como falso. Chicos cualquier otra alternativa para el cuerpo del método o el tipo de devolución sería genial.

La actualizada

public static boolean doesFileExist(AmazonS3 s3, String bucketName, String path) throws AmazonClientException, AmazonServiceException { boolean isValidFile = true; try { ObjectMetadata objectMetadata = s3.getObjectMetadata("cdn.generalsentiment.com", path); } catch (NotFoundException nfe) { isValidFile = false; } catch (Exception exception) { exception.printStackTrace(); isValidFile = false; } return isValidFile; }



La respuesta de Daan usando GET Bucket (List Objects) (a través del envoltorio respectivo de AWS para Java , ver a continuación) es el enfoque más eficiente para obtener la información deseada para muchos objetos a la vez (+1), tendrá que publicar el proceso la respuesta en consecuencia, por supuesto.

Esto se hace más fácilmente a través de uno de los métodos respectivos de la clase AmazonS3Client , por ejemplo, listObjects (String bucketName) :

AmazonS3 s3 = new AmazonS3Client(); // provide credentials, if need be ObjectListing objectListing = s3.listObjects(new ListObjectsRequest() .withBucketName("cdn.generalsentiment.com"); for (S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) { System.out.println(objectSummary.getKey()); }

Alternativa

Si solo está interesado en un solo objeto (archivo) a la vez, usar HEAD Object será mucho más eficiente, en la medida en que pueda deducir existencia directamente del respectivo código de respuesta HTTP (ver respuestas de error para más detalles ), es decir, 404 Not Found for una respuesta de NoSuchKey - La clave especificada no existe .

De nuevo, esto se hace más fácilmente a través de la clase AmazonS3Client , a saber getObjectMetadata (String bucketName, String key) , por ejemplo:

public static boolean isValidFile(AmazonS3 s3, String bucketName, String path) throws AmazonClientException, AmazonServiceException { boolean isValidFile = true; try { ObjectMetadata objectMetadata = s3.getObjectMetadata(bucketName, path); } catch (AmazonS3Exception s3e) { if (s3e.getStatusCode() == 404) { // i.e. 404: NoSuchKey - The specified key does not exist isValidFile = false; } else { throw s3e; // rethrow all S3 exceptions other than 404 } } return isValidFile; }