Télécharger le fichier Amazon S3 et obtenir l'URL

93

Est-il possible de télécharger un fichier txt / pdf / png sur Amazon S3 en une seule action et d'obtenir l'URL du fichier téléchargé en tant que réponse. Si tel est le cas, le kit AWS Java SDK est-il la bonne bibliothèque que je dois ajouter à mon application Web java struts2.

Veuillez me suggérer une solution pour cela.

Sangram Anand
la source

Réponses:

-31

Pour rendre le fichier public avant le téléchargement, vous pouvez utiliser la #withCannedAclméthode suivante PutObjectRequest:

myAmazonS3Client.putObject(new PutObjectRequest('some-grails-bucket',  'somePath/someKey.jpg', new    File('/Users/ben/Desktop/photo.jpg')).withCannedAcl(CannedAccessControlList.PublicRead))
Michael Astreiko
la source
45
Comment puis-je obtenir le lien de cette demande?
Andreas Rudolph
59
Cela ne nous dit pas comment obtenir l'URL publique de la ressource téléchargée.
Valentin Waeselynck
105

Non, vous ne pouvez pas obtenir l'URL en une seule action mais deux :)

Tout d'abord, vous devrez peut-être rendre le fichier public avant de le télécharger car cela n'a aucun sens d'obtenir l'URL à laquelle personne ne peut accéder. Vous pouvez le faire en définissant ACL comme Michael Astreiko l'a suggéré. Vous pouvez obtenir l'URL de la ressource en appelant getResourceUrlou getUrl.

AmazonS3Client s3Client = (AmazonS3Client)AmazonS3ClientBuilder.defaultClient();
s3Client.putObject(new PutObjectRequest("your-bucket", "some-path/some-key.jpg", new File("somePath/someKey.jpg")).withCannedAcl(CannedAccessControlList.PublicRead))
s3Client.getResourceUrl("your-bucket", "some-path/some-key.jpg");

Remarque1: la différence entre getResourceUrlet getUrlest que getResourceUrl renverra null lorsqu'une exception se produit.

Remarque 2: la getUrl méthode n'est pas définie dans l'interface AmazonS3. Vous devez convertir l'objet en AmazonS3Client si vous utilisez le générateur standard.

Hussachai
la source
25
Il convient de noter que cela ne se traduit que par un seul appel à AWS. Si vous creusez dans le SDK Java, vous verrez que s3Client.getResourceUrl("your-bucket", "some-path/some-key.jpg")l'URL fonctionne sans appel à AWS.
sihil le
3
Cela devrait vraiment être la réponse recommandée. L'autre réponse échoue pour les cas où le nom de fichier comprend des espaces. Dans de tels scénarios, le nom de fichier affiché sur S3 et le suffixe d'URL sont différents les uns des autres. La méthode s3Client.getUrl ci-dessus gère ce scénario correctement
RvPr
3
Remarque, getResourceUrln'est pas dans le dernier sdk.
Martin Serrano
1
Il est toujours là. Vous devrez peut-être convertir l'interface (AmazonS3) en classe (AmazonS3Client).
hussachai
6
pour le dernier sdk s3Client.getUrl("your-bucket", "some-path/some-key.jpg").toString();obtiendra l'url publique.
kristianva du
82

Vous pouvez le résoudre vous-même en fonction du compartiment et du nom de fichier que vous spécifiez dans la demande de téléchargement.

par exemple si votre bucket est mybucketet que votre fichier est nommé myfilename:

https://mybucket.s3.amazonaws.com/myfilename

Le s3bit sera différent selon la région dans laquelle se trouve votre bucket. Par exemple, j'utilise la région de l'Asie du Sud-Est, donc mes URL sont comme:

https://mybucket.s3-ap-southeast-1.amazonaws.com/myfilename
Jeffrey Kemp
la source
Après avoir téléchargé le fichier depuis la console de gestion AWS, les liens suivants fonctionnent pour un seul fichier, donc lequel pourrait être la réponse .. s3.amazonaws.com/cdn.generalsentiment.com/MVR/reports/… - cdn.generalsentiment. com.s3.amazonaws.com/MVR/reports/… - cdn.generalsentiment.com/MVR/reports/…
Sangram Anand
1
Oui, il existe des variantes de l'URL qui devraient fonctionner. Choisissez celui que vous souhaitez utiliser et allez-y.
Jeffrey Kemp du
Kool .. merci pour l'info .. Au fait, la partie de téléchargement va se faire avec la bibliothèque AWS sdk, n'est-ce pas?
Sangram Anand
Oui je crois bien. Mais je n'ai aucune expérience des entretoises.
Jeffrey Kemp
J'ai presque fini avec le téléchargement de chose .. mais frappé aux autorisations. Existe-t-il un moyen dans AWS java sdk pour S3 de nous permettre de rendre un fichier public avant le téléchargement.
Sangram Anand
6

Les réponses @hussachai et @Jeffrey Kemp sont plutôt bonnes. Mais ils ont quelque chose en commun, c'est que l'URL renvoyée est de style hôte virtuel, pas de style chemin. Pour plus d'informations sur le style d'URL s3, vous pouvez consulter Styles d'URL AWS S3 . Dans le cas où certaines personnes souhaitent générer une URL s3 de style chemin. Voici l'étape. Fondamentalement, tout sera le même que les réponses @hussachai et @Jeffrey Kemp, seulement avec un changement de paramètre de ligne comme ci-dessous:

AmazonS3Client s3Client = (AmazonS3Client) AmazonS3ClientBuilder.standard()
                    .withRegion("us-west-2")
                    .withCredentials(DefaultAWSCredentialsProviderChain.getInstance())
                    .withPathStyleAccessEnabled(true)
                    .build();

// Upload a file as a new object with ContentType and title specified.
PutObjectRequest request = new PutObjectRequest(bucketName, stringObjKeyName, fileToUpload);
s3Client.putObject(request);
URL s3Url = s3Client.getUrl(bucketName, stringObjKeyName);
logger.info("S3 url is " + s3Url.toExternalForm());

Cela générera une URL comme: https://s3.us-west-2.amazonaws.com/mybucket/myfilename

James
la source
5

De même, si vous voulez un lien via s3Client, vous pouvez utiliser ci-dessous.

System.out.println("filelink: " + s3Client.getUrl("your_bucket_name", "your_file_key"));
Omkar Ayachit
la source
2

un peu vieux mais toujours pour tous ceux qui tomberont dessus à l'avenir:

vous pouvez le faire avec une ligne en supposant que vous avez déjà écrit le CredentialProvider et le AmazonS3Client.

Il ressemblera à ceci:

 String ImageURL = String.valueOf(s3.getUrl(
                                  ConstantsAWS3.BUCKET_NAME, //The S3 Bucket To Upload To
                                  file.getName())); //The key for the uploaded object

et si vous n'avez pas écrit CredentialProvider et AmazonS3Client, ajoutez-les simplement avant d'obtenir l'URL comme ceci:

  CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
        getApplicationContext(),
        "POOL_ID", // Identity pool ID
        Regions.US_EAST_1 // Region
);
arceau
la source
0
        System.out.println("Link : " + s3Object.getObjectContent().getHttpRequest().getURI());

avec cela, vous pouvez récupérer le lien du fichier déjà téléchargé vers le compartiment S3.

Omkar Ayachit
la source
0

La méthode ci-dessous télécharge le fichier dans un dossier particulier dans un compartiment et renvoie l'URL générée du fichier téléchargé.

private String uploadFileToS3Bucket(final String bucketName, final File file) {
    final String uniqueFileName = uploadFolder + "/" + file.getName();
    LOGGER.info("Uploading file with name= " + uniqueFileName);
    final PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, uniqueFileName, file);
    amazonS3.putObject(putObjectRequest);
    return ((AmazonS3Client) amazonS3).getResourceUrl(bucketName, uniqueFileName);
}
Ankitech
la source