Amazon S3上传文件并获取URL

San*_*and 81 java amazon-s3 amazon-web-services

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

请为我建议一个解决方案.

hus*_*hai 94

不,你不能在单个动作中获取URL但是两个:)

首先,您可能必须在上传之前公开该文件,因为获取无人可访问的URL是没有意义的.你可以通过设置ACL来做到这一点,正如Michael Astreiko建议的那样.您可以通过调用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");
Run Code Online (Sandbox Code Playgroud)

注意1:getResourceUrl和 之间的不同之处getUrl在于,当发生异常时,getResourceUrl将返回null.

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

  • 值得注意的是,这只会导致对AWS的单次调用.如果您深入了解Java SDK,您将看到`s3Client.getResourceUrl("your-bucket","some-path/some-key.jpg")`在没有调用AWS的情况下编写URL. (21认同)
  • 对于较新的 SDK 版本,请尝试 `s3Client.utilities().getUrl(getUrlRequest);` (6认同)
  • 对于最新的sdk`s3Client.getUrl("your-bucket","some-path/some-key.jpg").toString();`将获取公共URL. (4认同)
  • 这应该是推荐的答案.对于文件名包含空格的情况,另一个答案失败.在这种情况下,S3上显示的文件名和URL后缀彼此不同.上面的s3Client.getUrl方法正确处理了这种情况 (3认同)
  • 注意,`getResourceUrl`不在最新的SDK中。 (3认同)

Jef*_*emp 79

鉴于您在上传请求中指定的存储桶和文件名,您可以自行完成.

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

https://mybucket.s3.amazonaws.com/myfilename
Run Code Online (Sandbox Code Playgroud)

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

https://mybucket.s3-ap-southeast-1.amazonaws.com/myfilename
Run Code Online (Sandbox Code Playgroud)


jam*_*mes 8

@hussachai 和 @Jeffrey Kemp 的回答非常好。但它们有一个共同点,即返回的 url 是虚拟主机样式,而不是路径样式。有关 s3 url 样式的更多信息,请参阅AWS S3 URL 样式。如果有些人想要生成路径样式 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());
Run Code Online (Sandbox Code Playgroud)

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


小智 6

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

System.out.println("filelink: " + s3Client.getUrl("your_bucket_name", "your_file_key"));
Run Code Online (Sandbox Code Playgroud)


Bal*_*ala 5

对于 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();
Run Code Online (Sandbox Code Playgroud)


小智 -48

要在上传之前公开文件,您可以使用以下#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();
Run Code Online (Sandbox Code Playgroud)

  • 这并没有告诉我们如何获取上传资源的公共url。 (64认同)
  • 如何从此请求中获取链接? (49认同)