112

是否可以通过单个操作将 txt/pdf/png 文件上传到 Amazon S3 ,并获取上传的文件 URL 作为响应?

如果是这样,AWS Java SDK 是我需要在我的 java struts2 Web 应用程序中添加的正确库吗?

请为此建议我一个解决方案。

4

10 回答 10

127

不,您无法通过单一操作获得 URL,但有两个 :)

首先,您可能必须在上传之前将文件公开,因为获取任何人都无法访问的 URL 是没有意义的。您可以按照 Michael Astreiko 的建议设置 ACL。您可以通过调用getResourceUrl或获取资源 URL 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");

注1:getResourceUrl和 的不同之处getUrl在于getResourceUrl在发生异常时会返回null。

注意2: getUrl AmazonS3 接口中没有定义方法。如果您使用标准构建器,则必须将对象转换为 AmazonS3Client。

于 2015-06-26T17:58:16.380 回答
91

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

例如,如果您的存储桶是mybucket并且您的文件名为myfilename

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

根据您的存储桶所在的地区,该s3位会有所不同。例如,我使用东南亚地区,所以我的网址如下:

https://mybucket.s3-ap-southeast-1.amazonaws.com/myfilename
于 2012-06-11T06:52:31.837 回答
9

@hussachai 和 @Jeffrey Kemp 的答案非常好。但它们的共同点是返回的 url 是虚拟主机样式的,而不是路径样式的。有关 s3 url 样式的更多信息,可以参考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

于 2019-07-23T19:59:52.717 回答
7

对于 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();
于 2020-09-20T17:32:46.513 回答
6

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

System.out.println("filelink: " + s3Client.getUrl("your_bucket_name", "your_file_key"));
于 2018-05-25T13:05:51.133 回答
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
);
于 2017-08-10T14:49:19.810 回答
1

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

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);
}
于 2020-09-13T07:06:07.787 回答
0
System.out.println("Link : " + s3Object.getObjectContent().getHttpRequest().getURI());

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

于 2018-05-25T07:23:47.077 回答
0

如果您使用的是 AWS-SDK,则data返回的对象包含data.Location

const AWS = require('aws-sdk')
const s3 = new AWS.S3(config)

s3.upload(params).promise()
    .then((data)=>{
        console.log(data.Location)
    })
    .catch(err=>console.log(err))

于 2021-12-29T03:58:24.153 回答
-46

要在上传之前公开文件,您可以使用以下#withCannedAcl方法PutObjectRequest

myAmazonS3Client.putObject(new PutObjectRequest('some-grails-bucket',  'somePath/someKey.jpg', new    File('/Users/ben/Desktop/photo.jpg')).withCannedAcl(CannedAccessControlList.PublicRead))

String url = myAmazonS3Client.getUrl('some-grails-bucket',  'somePath/someKey.jpg').toString();
于 2012-10-07T13:49:49.100 回答