web-dev-qa-db-fra.com

AWS S3 Java SDK - Télécharger le fichier d'aide

Le code ci-dessous ne fonctionne que pour le téléchargement de fichiers texte à partir d'un compartiment de S3. Cela ne fonctionne pas pour une image. Existe-t-il un moyen plus simple de gérer les téléchargements/types à l'aide du kit AWS SDK? L'exemple inclus dans la documentation ne le rend pas apparent. Merci!

AWSCredentials myCredentials = new BasicAWSCredentials(
       String.valueOf(Constants.act), String.valueOf(Constants.sk)); 
AmazonS3Client s3Client = new AmazonS3Client(myCredentials);        
S3Object object = s3Client.getObject(new GetObjectRequest("bucket", "file"));

BufferedReader reader = new BufferedReader(new InputStreamReader(
       object.getObjectContent()));
File file = new File("localFilename");      
Writer writer = new OutputStreamWriter(new FileOutputStream(file));

while (true) {          
     String line = reader.readLine();           
     if (line == null)
          break;            

     writer.write(line + "\n");
}

writer.close();
33
user375566

Au lieu des classes Reader et Writer, vous devriez utiliser les classes InputStream et OutputStream:

InputStream reader = new BufferedInputStream(
   object.getObjectContent());
File file = new File("localFilename");      
OutputStream writer = new BufferedOutputStream(new FileOutputStream(file));

int read = -1;

while ( ( read = reader.read() ) != -1 ) {
    writer.write(read);
}

writer.flush();
writer.close();
reader.close();
33
Maurício Linhares

Bien que le code écrit dans la réponse de Mauricio fonctionne (et son point sur les flux est bien sûr correct), Amazon offre un moyen plus rapide de sauvegarder des fichiers dans leur SDK. Je ne sais pas s'il n'était pas disponible en 2011 ou non, mais c'est maintenant.

AmazonS3Client s3Client = new AmazonS3Client(myCredentials);

File localFile = new File("localFilename");

ObjectMetadata object = s3Client.getObject(new GetObjectRequest("bucket", "s3FileName"), localFile);
55
Eyal

La réponse de Eyals vous amène à mi-chemin mais ce n'est pas tout à fait clair, donc je vais clarifier. 

AmazonS3Client s3Client = new AmazonS3Client(myCredentials);

//This is where the downloaded file will be saved
File localFile = new File("localFilename");

//This returns an ObjectMetadata file but you don't have to use this if you don't want 
s3Client.getObject(new GetObjectRequest(bucketName, id.getId()), localFile);

//Now your file will have your image saved 
boolean success = localFile.exists() && localFile.canRead(); 
13
Shawn Vader

Il existe même un moyen beaucoup plus simple d'obtenir ceci. J'ai utilisé l'extrait ci-dessous. Référence référencée de http://docs.ceph.com/docs/mimic/radosgw/s3/Java/

AmazonS3 s3client = AmazonS3ClientBuilder.standard()
                .withCredentials(new AWSStaticCredentialsProvider(credentials)).withRegion(Regions.US_EAST_1).build();

s3client.getObject(
                new GetObjectRequest("nomad-prop-pics", "Documents/1.pdf"),
                new File("D:\\Eka-Contract-Physicals-Dev\\Contracts-Physicals\\utility-service\\downlods\\1.pdf")
    );
1
user10913634

Utilisez Java.nio.file.Files pour copier S3Object dans un fichier local.

public File getFile(String fileName) throws Exception {
    if (StringUtils.isEmpty(fileName)) {
        throw new Exception("file name can not be empty");
    }
    S3Object s3Object = amazonS3.getObject("bucketname", fileName);
    if (s3Object == null) {
        throw new Exception("Object not found");
    }
    File file = new File("you file path");
    Files.copy(s3Object.getObjectContent(), file.toPath());
    inputStream.close();
    return file;
}
0
Nitin Vavdiya