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