web-dev-qa-db-fra.com

Comment télécharger un fichier de s3 en utilisant l'URL fournie?

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?

4
Rohit Chouhan

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:

  • Rendre l’objet lisible publiquement: Ceci peut être fait via la console ou la CLI/API. Cependant, n'importe qui avec cette URL pourra le télécharger.
  • Créer une Stratégie Amazon S3 Bucket qui accorde un accès en lecture au fichier/répertoire/compartiment souhaité. Mais, encore une fois, toute personne avec l'URL pourra accéder à ces objets.
  • Conservez l'objet privé, mais utilisez une URL pré-signée qui ajoute des paramètres à l'URL pour prouver que vous êtes autorisé à télécharger l'objet. Cette URL pré-signée est limitée dans le temps et peut être générée avec quelques lignes de code utilisant les informations d'identification AWS actuelles.
4
John Rotenstein

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

2
Jawad

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.

1
ITAdminNC

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();
    }
} 
0
Chris Turner

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.

0
Alberto Cerqueira

utilisation de cli: aws s3 cp s3: // compartiment/préfixe/clé targetlocalfolder

0
tooptoop4

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

0
Reza Mousavi