Dans mon application, je vais obtenir l'URL du fichier s3 du type: https://s3.amazonaws.com/account-update/input.csv Je dois le télécharger, puis le traiter . Ce que j'ai déjà fait:
AmazonS3 s3 = new AmazonS3Client(credentials);
S3Object s3object = s3.getObject(new GetObjectRequest(
bucketName, key));
Je peux télécharger le fichier en fournissant le nom et la clé du compartiment, mais comment puis-je télécharger le fichier à l'aide de l'URL ( https://s3.amazonaws.com/account-update/input.csv ) uniquement?
Vous pouvez télécharger le fichier via un fichier curl/wget standard, comme vous le feriez pour tout autre fichier Internet.
L'important, cependant, consiste à activer l'accès à l'objet à partir d'Amazon S3. Quelques options:
Vous pouvez envisager d'utiliser la classe AWS SDK AmazonS3URI comme indiqué ci-dessous:
URI fileToBeDownloaded = new URI(" https://s3.amazonaws.com/account-update/input.csv");
AmazonS3URI s3URI = new AmazonS3URI(fileToBeDownloaded);
S3Object s3Object = s3Client.getObject(s3URI.getBucket(), s3URI.getKey());
A partir de là, vous devriez pouvoir utiliser le s3Object obtenu de manière similaire au s3Object indiqué dans votre code.
Pour plus d'exemples de SDK AWS liés à Java concernant l'utilisation de cette classe, vérifiez ici
Pour activer l'accès par HTTP, vous devez configurer le compartiment en tant que Static Website dans la console S3. Soyez averti, cela exposera toutes vos données sur le Web, sauf si vous configurez les contrôles d'accès S3 appropriés.
La méthode à laquelle vous accédez via le SDK Java n'utilisera toutefois pas ce type de connexion. Il se connectera via le protocole S3 intégré. Vous devez inspecter votre stratégie ou rôle IAM pour vous assurer que vous disposez des autorisations appropriées (s3:GetObject
). Vous aurez également besoin de s3:ListBucket
pour voir un 404 si l’objet n’existe pas.
John Rotenstein est correct, vous pouvez télécharger le fichier via l’URL en utilisant curl/wget standard.
Si vous vouliez utiliser Java, vous devriez utiliser l'une des méthodes suivantes: utilisant le Apache HttpComponents package
private void downloadRequest(String url, String savedFile) {
HttpClient client = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(url);
HttpResponse response;
try {
response = client.execute(httpGet);
HttpEntity entity = response.getEntity();
if (entity != null) {
try (FileOutputStream outstream = new FileOutputStream(savedFile)) {
entity.writeTo(outstream);
} catch (IOException e) {
LOGGER.info(e.getMessage());
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
Vous ne pouvez pas, mais vous pouvez créer la pièce jointe en téléchargement.
Pour exemple:
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentType("application/csv;charset=utf-8");
objectMetadata.setContentDisposition("attachment");
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, arquivo, file, objectMetadata).withCannedAcl(CannedAccessControlList.PublicRead);
amazonS3.putObject(putObjectRequest);
J'espère que ça aide.
utilisation de cli: aws s3 cp s3: // compartiment/préfixe/clé targetlocalfolder
Le meilleur moyen consiste à utiliser l'URL S3 pré-signée pour répondre à vos besoins . Vous pouvez ajouter un délai d'expiration à vos URL signées, après quoi l'URL n'est pas disponible.
Pour plus d'informations, lisez la page suivante:
https://docs.aws.Amazon.com/AmazonS3/latest/dev/ShareObjectPreSignedURLJavaSDK.html