Amazon S3 upload file and get URL

后端 未结 9 1442
醉酒成梦
醉酒成梦 2020-12-23 03:05

Is it possible to upload a txt/pdf/png file to Amazon S3 in a single action, and get the uploaded file URL as the response. If so, is AWS Java SDK the right library that I n

相关标签:
9条回答
  • 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.

    0 讨论(0)
  • 2020-12-23 03:09

    Below method uploads file in a particular folder in a bucket and return the generated url of the file uploaded.

    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);
    }
    
    0 讨论(0)
  • 2020-12-23 03:18

    @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

    0 讨论(0)
  • 2020-12-23 03:27

    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
    
    0 讨论(0)
  • 2020-12-23 03:27

    a bit old but still for anyone stumbling upon this in the future:

    you can do it with one line assuming you already wrote the CredentialProvider and the AmazonS3Client.

    it will look like this:

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

    and if you didn't wrote the CredentialProvider and the AmazonS3Client then just add them before getting the URL like this:

      CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
            getApplicationContext(),
            "POOL_ID", // Identity pool ID
            Regions.US_EAST_1 // Region
    );
    
    0 讨论(0)
  • 2020-12-23 03:29
            System.out.println("Link : " + s3Object.getObjectContent().getHttpRequest().getURI());
    

    with this you can retrieve the link of already uploaded file to S3 bucket.

    0 讨论(0)
提交回复
热议问题