web-dev-qa-db-fra.com

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

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 réponse. Si tel est le cas, AWS Java sdk est-il la bonne bibliothèque à ajouter à mon application web struts2 Java?.

Suggérez-moi une solution pour cela.

75
Sangram Anand

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 le téléchargement car il n’a aucun sens d’obtenir l’URL à laquelle personne ne peut accéder. Vous pouvez le faire en définissant ACL comme suggéré par Michael Astreiko. Vous pouvez obtenir l'URL de la ressource en appelant getResourceUrl ou 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");

Note1: La différence entre getResourceUrl et getUrl est que getResourceUrl retournera null lorsque une exception se produira.

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

79
hussachai

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 compartiment est mybucket et que votre fichier est nommé myfilename:

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

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

https://mybucket.s3-ap-southeast-1.amazonaws.com/myfilename
74
Jeffrey Kemp

De même, si vous souhaitez créer un lien via s3Client, vous pouvez utiliser ci-dessous.

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

un peu vieux mais toujours pour quiconque trébuche à l'avenir:

vous pouvez le faire avec une ligne en supposant que vous avez déjà écrit CredentialProvider et 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 suivante:

  CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
        getApplicationContext(),
        "POOL_ID", // Identity pool ID
        Regions.US_EAST_1 // Region
);
2
rollcage

@hussachai et @Jeffrey Kemp, les réponses sont plutôt bonnes. Mais ils ont quelque chose en commun: l'URL renvoyée est du style Virtual-Host, pas du style de chemin. Pour plus d'informations sur le style de l'URL s3, vous pouvez vous référer à styles d'URL AWS S . Si certaines personnes veulent avoir le style de chemin s3 généré. Voici le pas. En gros, tout sera identique à @hussachai et @Jeffrey Kemp, mais avec un changement de réglage 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 du type: https://s3.us-west-2.amazonaws.com/mybucket/myfilename

0
james
        System.out.println("Link : " + s3Object.getObjectContent().getHttpRequest().getURI());

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

0
Omkar Ayachit