¿Cómo descargar archivos de Amazon S3?

Tengo una carpeta llamada outputdentro de un cubo llamado BucketA. Tengo una lista de archivos en la outputcarpeta. ¿Cómo los descargo a mi máquina local con AWS Java SDK?

Abajo está mi código:

AmazonS3Client s3Client = new AmazonS3Client(credentials);
        File localFile = new File("/home/abc/Desktop/AmazonS3/");
        s3Client.getObject(new GetObjectRequest("bucketA", "/bucketA/output/"), localFile);

Y recibí el error:

AmazonS3Exception: The specified key does not exist.
Respuesta 1

Tenga en cuenta que S3 no es un sistema de archivos, pero es un almacén de objetos . Hay una gran diferencia entre los dos, uno es que las actividades de estilo de directorio simplemente no funcionarán.

Supongamos que tiene un depósito S3 con dos objetos:

/path/to/file1.txt
/path/to/file2.txt

Al trabajar con estos objetos, no puede referirse simplemente /path/to/como cuando trabaja con archivos en un directorio del sistema de archivos. Esto se debe a /path/to/que no es un directorio, sino solo parte de una clave en una tabla hash muy grande. Es por eso que el mensaje de error indica un problema con una clave . Estas no son rutas de nombre de archivo, sino claves de objetos dentro del almacén de objetos.

Para copiar todos los archivos en una ubicación como la /path/to/que necesita realizar en varios pasos. Primero, necesita obtener una lista de todos los objetos cuyas claves comienzan /path/to, luego debe recorrer cada objeto individual y copiarlos uno por uno.

Aquí hay una pregunta similar con una respuesta que muestra cómo descargar múltiples archivos de S3 usando Java.

Respuesta: 2

Sé que esta pregunta se hizo hace mucho tiempo, pero aún así esta respuesta podría ayudar a alguien.

Es posible que desee utilizar algo como esto para descargar objetos de S3

 new ListObjectsV2Request().withBucketName("bucketName").withDelimiter("delimiter").withPrefix("path/to/image/");

como se menciona en el documento S3

delimitador sea "/" y el prefijo sea ​​su "carpeta como estructura" .

Respuesta: 3

Puede usar las clases predefinidas para cargar el directorio y descargar el directorio

Para descargar

MultipleFileDownload xfer = xfer_mgr.downloadDirectory(
    bucketName, key, new File("C:\\Users\\miracle\\Deskto\\Downloads"));

Para subir

MultipleFileUpload xfer = xfer_mgr.uploadDirectory(bucketName, key,Dir,true);
Respuesta: 4

Estoy en duda con eso, en lenguaje Java, necesitamos adquirir el bloqueo, antes de esperar alguna condición para ser satisfecho. Por ejemplo, bloqueo de monitor int java: sincronizado (bloqueo) {System.out.println (...

Tengo un algoritmo que calcula el percentil (85) con Apache Commons de una serie de valores (12 valores), para una evaluación posterior con un umbral para tomar una decisión. El resultado es similar al ...

Estoy tratando de usar java.time.LocalDate en mi aplicación de Android, sin embargo, si trato de importarlo, cualquier clase de java.time da un error de símbolo no puede resolver en Android studio 1.1 La única razón por la que ...

Utilizo las pruebas JUnit y AssertJ para mi aplicación Swing escrita en Java 8. Me gustaría probar si el valor del control deslizante cambia cuando se hace clic en un botón, pero no encontré ninguna forma de obtener un valor actual de un ...