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.
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.
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
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"));
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
);
@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
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.