How to get public URL after uploading image to S3?
Solution 1
Your application should be using some configuration/properties file, where the name of the bucket is stored for later reference. Use, for example, a properties file with a properties defined like this:
application.bucket=mybucket-example-com
Use this value both when referencing the bucket in your app (eg replace _bucket
with application.bucket
in your code), and when you want to express or return the public URL.
If your app has uploaded a file to the key userid/images/test.jpg
, then the public URL can be expressed as:
https://[application.bucket].s3.amazonaws.com/[key]
This will resolve to the public URL of
https://mybucket-example-com.s3.amazonaws.com/userid/images/test.jpg
The nice thing about this approach is that in your testing environment, you can have a different bucket specified in your test configuration.
In testing, you may want to use application.bucket=test-mybucket-example-com
.
This way your code would not require any changes in this regard when switching between production and testing environments.
Solution 2
You could actually build this url based on the bucket name and the path where you uploaded the file. See this doc about accessing a bucket, where it describes the url format.
e.g:
https://bucket.s3.amazonaws.com/path/to/your/file
https://bucket.s3-aws-region.amazonaws.com/path/to/your/file
https://s3-aws-region.amazonaws.com/bucket/path/to/your/file
Please note that your file must be public, otherwise you will get a permission denied.
Note: the path-style (https://s3-aws-region.amazonaws.com/bucket/path/to/your/file
is now deprecated and should not be used anymore
gog
Updated on July 22, 2022Comments
-
gog almost 2 years
I'm developing a C# application in which I make some uploads to AWS S3 service. I'm reading the docs and I can't find where to get the public URL after a upload. Here's my code:
public void AddFile(Stream image, string key) { var uploadRequest = new TransferUtilityUploadRequest(); uploadRequest.CannedACL = S3CannedACL.PublicRead; uploadRequest.InputStream = image; uploadRequest.BucketName = _bucket; uploadRequest.Key = key; using (TransferUtility fileTransferUtility = new TransferUtility(_client)) { fileTransferUtility.Upload(uploadRequest); } }
As you can see I put the access to file as public with S3CannedACL.PublicRead. So it will act like a CDN, I know that amazon has the CloudFront service for CDN servers but I must use the S3 regular bucket.
I want to know if its possible to get the fixed URL after the upload method. I just can see on the tutorials and documentation to get the "
PreSignedUrl
" with expire time, but I don't want expire time, I need to save this URL on the database.