Amazon S3上传文件并获取URL

时间:2012-06-11 06:43:07

标签: java amazon-s3 amazon-web-services

是否可以通过单个操作将txt / pdf / png文件上传到Amazon S3,并将上传的文件URL作为响应。如果是这样,AWS Java sdk是否需要在我的java struts2 webapplication中添加正确的库。

请建议我解决此问题。

9 个答案:

答案 0 :(得分:80)

不,你不能在一次行动中获得URL而是两次:)

首先,您可能必须在上传之前公开该文件,因为获取无人可访问的URL是没有意义的。你可以通过设置ACL来做到这一点,正如Michael Astreiko建议的那样。 您可以通过致电getResourceUrlgetUrl来获取资源网址。

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

<强>注1: getResourceUrlgetUrl之间的不同之处在于,当发生异常时,getResourceUrl将返回null。

<强>注2: AmazonS3界面中未定义getUrl方法。如果使用标准构建器,则必须将对象强制转换为AmazonS3Client。

答案 1 :(得分:74)

根据您在上传请求中指定的存储桶和文件名,您可以自行解决。

e.g。如果您的广告资源为mybucket且文件名为myfilename

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

s3位将根据您的存储区所在的区域而有所不同。例如,我使用东南亚地区,因此我的网址如下:

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

答案 2 :(得分:3)

同样,如果你想通过s3Client链接,你可以在下面使用。

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

答案 3 :(得分:2)

有点旧,但仍然会有人在将来绊倒这个:

假设您已经编写了CredentialProvider和AmazonS3Client,您可以用一行来完成。

它看起来像这样:

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

如果你没有写过CredentialProvider和AmazonS3Client,那么只需在获取这样的URL之前添加它们:

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

答案 4 :(得分:2)

对于AWS开发工具包2 +

String key = "filePath";
String bucketName = "bucketName";
PutObjectResponse response = s3Client
            .putObject(PutObjectRequest.builder().bucket(bucketName ).key(key).build(), RequestBody.fromFile(file));
 GetUrlRequest request = GetUrlRequest.builder().bucket(bucketName ).key(key).build();
 String url = s3Client.utilities().getUrl(request).toExternalForm();

答案 5 :(得分:1)

以下方法将文件上传到存储桶中特定文件夹中,并返回上传文件的生成网址。

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

答案 6 :(得分:0)

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

使用此功能,您可以检索已上传文件到S3存储桶的链接。

答案 7 :(得分:0)

@hussachai和@Jeffrey Kemp的回答非常好。但是它们有一个共同点,就是返回的url是虚拟主机样式的,而不是路径样式的。有关s3网址样式的更多信息,请参阅AWS S3 URL Styles。如果有人想生成路径样式s3 url。这是步骤。基本上,所有内容都将与@hussachai和@Jeffrey Kemp答案相同,仅一行更改如下:

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

这将生成如下网址:     https://s3.us-west-2.amazonaws.com/mybucket/myfilename

答案 8 :(得分:-7)

要在上传前公开文件,您可以使用#withCannedAcl的{​​{1}}方法:

PutObjectRequest