是否可以通过单个操作将txt / pdf / png文件上传到Amazon S3,并获得上传的文件URL作为响应。如果是这样,AWS Java SDK是我需要在java struts2 Web应用程序中添加的正确库。
请为我建议一个解决方案。
Answers:
要在上传之前将文件公开,可以使用以下#withCannedAcl
方法PutObjectRequest
:
myAmazonS3Client.putObject(new PutObjectRequest('some-grails-bucket', 'somePath/someKey.jpg', new File('/Users/ben/Desktop/photo.jpg')).withCannedAcl(CannedAccessControlList.PublicRead))
不,您无法通过一次操作获得该网址,但只有两个:)
首先,您可能需要在上传之前将文件公开,因为获取没有人可以访问的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。
s3Client.getResourceUrl("your-bucket", "some-path/some-key.jpg")
无需调用AWS即可解决的URL。
getResourceUrl
不在最新的SDK中。
s3Client.getUrl("your-bucket", "some-path/some-key.jpg").toString();
将获取公共网址。
s3Client.utilities().getUrl(getUrlRequest);
给定存储桶和在上传请求中指定的文件名,您可以自己解决。
例如,如果您的存储桶位于,mybucket
并且您的文件名为myfilename
:
https://mybucket.s3.amazonaws.com/myfilename
该s3
位将取决于哪个区域的桶中是不同的。例如,我用的是东南亚地区,所以我的网址是这样的:
https://mybucket.s3-ap-southeast-1.amazonaws.com/myfilename
@hussachai和@Jeffrey Kemp的回答非常好。但是它们有一个共同点,就是返回的url是虚拟主机样式的,而不是路径样式的。有关s3网址样式的更多信息,请参阅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());
这将生成如下网址:https: //s3.us-west-2.amazonaws.com/mybucket/myfilename
同样,如果要通过s3Client链接,可以在下面使用。
System.out.println("filelink: " + s3Client.getUrl("your_bucket_name", "your_file_key"));
有点老了,但对于将来在此绊脚的任何人仍然:
假设您已经编写了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
);
对于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();
System.out.println("Link : " + s3Object.getObjectContent().getHttpRequest().getURI());
这样,您可以将已经上传的文件的链接检索到S3存储桶。
下面的方法将文件上传到存储桶中特定文件夹中,并返回上传文件的生成的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);
}