使用其预签名 URL 从 AWS s3 读取文件的内容

Posted

技术标签:

【中文标题】使用其预签名 URL 从 AWS s3 读取文件的内容【英文标题】:Read the contents of a file from AWS s3 using its Pre-signed URL 【发布时间】:2017-10-15 15:25:10 【问题描述】:

我正在尝试使用 AWS Java Sdk 从 s3 存储桶读取和打印文件的内容。我有一个预签名的 URL,可以让我访问(和下载)文件。但是,我无法使用预签名 URL 读取文件。

我正在寻找类似于下面的代码 sn-p 的东西 -

public void readFromS3(String bucketName, String key) throws IOException 
S3Object s3object = s3.getObject(new GetObjectRequest(bucketName, key));
System.out.println(s3object.getObjectMetadata().getContentType());
System.out.println(s3object.getObjectMetadata().getContentLength());

BufferedReader reader = new BufferedReader(new InputStreamReader(s3object.getObjectContent()));

String line;

while((line = reader.readLine()) != null) 
// can copy the content locally as well
// using a buffered writer

System.out.println(line);


我可以访问的 URL,让我下载文件。

我也查看了以下参考但没有成功 -

http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/AmazonS3Client.html

http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/model/GetObjectRequest.html

有人可以帮忙吗?

提前致谢!

【问题讨论】:

“无法阅读”是非常模糊的问题陈述。你有任何例外吗?如果有,请添加异常堆栈。 我为含糊的声明道歉。但是,我不知道如何使用预签名的 Url 来读取文件。 GetObjectRequest 构造函数都不能与 URL 一起使用。我在这里有什么选择?我不想下载文件。有没有办法从预签名的 Url 中获取 bucketName 和 key 并使用它来读取文件? 【参考方案1】:

使用 URLConnection 可能是最简单的方法,正如其他人指出的那样,此时它只是一个常规的 HTTP URL。

BufferedReader reader = new BufferedReader(new InputStreamReader(URI.create(presignedUrl).toURL().openConnection().getInputStream())

【讨论】:

【参考方案2】:

如果您有预签名 URL,则无需使用 AWS sdk 来访问 S3 对象。

正如@EricNord 评论的那样,url 本身提供了 S3 的身份验证以允许访问。该 URL 将在查询参数中附加一个 STS 令牌,从而启用身份验证。

基本的 HTTP 客户端将能够读取 URL 的内容。

【讨论】:

url本身提供s3认证,允许访问【参考方案3】:

您可以很好地使用 TransferManager :)

String presignedURL = "presignedURL";
String targetDestination = "fileLocation"
    new TransferManager().download(new PresignedUrlDownloadRequest(new URL(presignedURL)),
            new File(targetDestination)).waitForCompletion();

【讨论】:

以上是关于使用其预签名 URL 从 AWS s3 读取文件的内容的主要内容,如果未能解决你的问题,请参考以下文章

仅从浏览器使用预签名 URL 上传时出现 AWS S3 CORS 错误

AWS S3 生成签名 URL ''AccessDenied''

使用 Filesystem Laravel 5.2 从 amazon s3 获取文件的签名 URL

PUT 上传文件到 AWS S3 预签名 URL Retrofit2 Android

AWS S3 PHP SDK 预签名 url 限制内容类型

AWS S3 PHP SDK 预签名 url 限制内容类型