2012-06-11 137 views
60

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

请给我一个解决方案。

回答

-2

要使文件上传公众可以使用的PutObjectRequest#withCannedAcl方法之前:

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

如何从该请求中获取链接? –

+40

这并不告诉我们如何获取上传资源的公开网址。 –

62

根据您在上传请求中指定的存储桶和文件名,您可以为自己制定出来。

例如如果你的水桶是mybucket和你的文件被命名为myfilename

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

s3位将取决于哪个区域的桶中是不同的。例如,我用的是东南亚地区,所以我的网址都一样:

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

上传文件后从AWS管理控制台,以下链接适用于单个文件,因此哪一个可以作为响应.. https://s3.amazonaws.com/cdn.generalsentiment.com/MVR/reports/2010-11_Hollywood_Buzz_Digest.pdf - http://cdn.generalsentiment.com.s3.amazonaws.com/MVR/reports/2010-11_Hollywood_Buzz_Digest.pdf - - http://cdn.generalsentiment.com/MVR/reports/2010-11_Hollywood_Buzz_Digest.pdf –

+1

是的,网址应该有变化。选择一个你想使用的,并与它一起去。 –

+0

Kool ..感谢您的信息..顺便说一下,上传部分将与AWS sdk库做对吗? –

61

不,你不能单独获取网址但只有两个:)

首先,您可能必须在上传之前公开文件,因为获取无人可访问的URL是没有意义的。你可以通过设置迈克尔阿斯特雷科建议的ACL来做到这一点。 您可以通过调用getResourceUrlgetUrl来获取资源URL。

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

不同getResourceUrlgetUrl之间是当发生异常时getResourceUrl将返回null。

+14

值得注意的是,这只会导致对AWS的单个调用。如果您深入了解Java SDK,您会看到's3Client.getResourceUrl(“your-bucket”,“some-path/some-key.jpg”)在不调用AWS的情况下找出URL。 – sihil

+1

这真的应该是建议的答案。另一个答案在文件名包含空格的情况下失败。在这种情况下,S3上显示的文件名和URL后缀互不相同。上面的s3Client.getUrl方法正确处理了这种情况 – RvPr

1

有点老,但仍然有人在将来在这个绊脚石:

你可以用一条线假设做到这一点,你已经写了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 
);