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;
}
Utilice la API GET Bucket S3:
http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTBucketGET.html
y especifica el nombre completo del archivo como un prefijo.
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;
}