42 votes

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 panier dans S3. Il ne fonctionne pas pour une image. Existe-t-il un moyen plus simple de gérer les téléchargements/types à l'aide du SDK AWS ? L'exemple inclus dans la documentation ne le fait pas apparaître. Je vous remercie de votre attention.

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();

0 votes

J'ai essayé votre code mais le jar n'est pas trouvé, pouvez-vous me suggérer quel jar utiliser ? actuellement j'utilise aws-Android-sdk-2.1.5-s3.jar mais je n'ai pas trouvé toutes les classes.

0 votes

J'ai utilisé votre code pour télécharger un fichier et cela fonctionne parfaitement.

69voto

Eyal Points 1106

Bien que le code écrit dans la réponse de Mauricio fonctionne - et son point sur les flux est bien sûr correct - Amazon propose un moyen plus rapide d'enregistrer les fichiers dans son SDK. Je ne sais pas si ce n'était pas disponible en 2011 ou non, mais ça l'est maintenant.

AmazonS3Client s3Client = new AmazonS3Client(myCredentials);

File localFile = new File("localFilename");

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

4 votes

Une petite modification s'impose : le contenu de l'objet est sauvegardé dans le fichier, mais l'objet renvoyé est ObjectMetadata , pas S3Object . Voir docs.amazonwebservices.com/AWSJavaSDK/latest/javadoc/com/

1 votes

@azdev En fait, l'exemple de code utilise une version différente de getObject qui renvoie bien un S3Object.

0 votes

Comment se fait-il que je ne puisse pas voir la méthode S3Client.getObject dans mon code ? Je veux réaliser la même chose mais il n'y a pas de méthode de ce type associée à mon objet s3Client.

46voto

Maurício Linhares Points 19468

Au lieu de Reader y Writer les classes que vous devriez utiliser InputStream y OutputStream classes :

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();

1 votes

Ces travaux Les programmes listés par la documentation d'aws ne fonctionnent pas. Merci d'avoir posté ce document.

18voto

Shawn Vader Points 3080

La réponse d'Eyals vous permet de faire la moitié du chemin, mais elle n'est pas très claire et je vais donc la 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();

0 votes

Ce que vous avez utilisé pour id.getId()) ?

0 votes

L'id.getId() est la clé que vous avez utilisée pour stocker l'objet dans le seau. J'utilise mon identifiant comme clé car je sais qu'il est unique. Pour résumer, vous créez un fichier vide, faites un getRequest en indiquant à l'api d'aws où se trouve le nouveau fichier vide et l'api d'aws s'occupe d'écrire l'objet dans le fichier que vous avez spécifié. C'est très pratique.

0 votes

@ShawnVader : Pouvez-vous préciser pourquoi vous validez le fichier ? Je pensais que l'api S3 vérifiait le hachage. Je vous remercie.

4voto

user10913634 Points 39

Il existe même un moyen beaucoup plus simple d'y parvenir. J'ai utilisé l'extrait ci-dessous. J'ai obtenu la référence 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")
    );

2voto

Nitin Vavdiya Points 475

Utilisation 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());
    return file;
}

0 votes

D'où vient inputStream ? Je pense que vous voulez dire s3Object.close ou s3Object.getObjectContent.close(). Quoi qu'il en soit, nio est une bonne suggestion.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X