Amazon S3上传文件并获取URL


Answers:


-34

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

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

46
如何从该请求中获取链接?
2014年

60
这并没有告诉我们如何获取上载资源的公共URL。
Valentin Waeselynck,2014年

为什么这是公认的答案?
lanxion

107

不,您无法通过一次操作获得该网址,但只有两个:)

首先,您可能需要在上传之前将文件公开,因为获取没有人可以访问的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。


27
值得注意的是,这只会导致对AWS的单个调用。如果深入研究Java SDK,您将看到s3Client.getResourceUrl("your-bucket", "some-path/some-key.jpg")无需调用AWS即可解决的URL。
sihil

3
这确实应该是推荐的答案。对于文件名包含空格的情况,另一个答案将失败。在这种情况下,S3上显示的文件名和URL后缀彼此不同。上面的s3Client.getUrl方法正确处理了这种情况
RvPr

3
注意,getResourceUrl不在最新的SDK中。
马丁·塞拉诺

6
对于最新的SDK,s3Client.getUrl("your-bucket", "some-path/some-key.jpg").toString();将获取公共网址。
kristianva

2
如需更新的SDK版本,请尝试s3Client.utilities().getUrl(getUrlRequest);
mrog

84

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

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

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

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

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

从上传AWS管理控制台中的文件后,以下链接的作品为一个单独的文件,所以这一个可能是响应.. s3.amazonaws.com/cdn.generalsentiment.com/MVR/reports/... - cdn.generalsentiment。 com.s3.amazonaws.com/MVR/reports/... - cdn.generalsentiment.com/MVR/reports/...
SANGRAM阿南德

1
是的,应该有一些变体的网址。选择一个您要使用的,然后继续使用。
杰弗里·肯普

Kool ..谢谢您的信息。顺便说一下,上载部分将与AWS sdk库有关?
Sangram Anand 2012年

是的,我相信。但是我没有Struts的经验。
Jeffrey Kemp 2012年

我几乎完成了上传的工作..但对权限感到震惊。S3的AWS Java SDK中是否可以让我们在上传之前将文件公开。
Sangram Anand 2012年

6

@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


5

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

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

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

1

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

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

这样,您可以将已经上传的文件的链接检索到S3存储桶。


0

下面的方法将文件上传到存储桶中特定文件夹中,并返回上传文件的生成的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);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.