Amazon S3 upload file and get URL Amazon S3 upload file and get URL java java

Amazon S3 upload file and get URL


No you cannot get the URL in single action but two :)

First of all, you may have to make the file public before uploading because it makes no sense to get the URL that no one can access. You can do so by setting ACL as Michael Astreiko suggested.You can get the resource URL either by calling getResourceUrl or 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:The different between getResourceUrl and getUrl is that getResourceUrl will return null when exception occurs.

Note2:getUrl method is not defined in the AmazonS3 interface. You have to cast the object to AmazonS3Client if you use the standard builder.


You can work it out for yourself given the bucket and the file name you specify in the upload request.

e.g. if your bucket is mybucket and your file is named myfilename:

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

The s3 bit will be different depending on which region your bucket is in. For example, I use the south-east asia region so my urls are like:

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


@hussachai and @Jeffrey Kemp answers are pretty good. But they have something in common is the url returned is of virtual-host-style, not in path style. For more info regarding to the s3 url style, can refer to AWS S3 URL Styles. In case of some people want to have path style s3 url generated. Here's the step. Basically everything will be the same as @hussachai and @Jeffrey Kemp answers, only with one line setting change as below:

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());

This will generate url like: https://s3.us-west-2.amazonaws.com/mybucket/myfilename