Java 如何使用提供的url从s3下载文件?

Java 如何使用提供的url从s3下载文件?,java,amazon-web-services,amazon-s3,aws-java-sdk,Java,Amazon Web Services,Amazon S3,Aws Java Sdk,在我的应用程序中,我将获得s3文件的url,如: 我必须下载它,然后处理它。 我已经做了: AmazonS3 s3 = new AmazonS3Client(credentials); S3Object s3object = s3.getObject(new GetObjectRequest( bucketName, key)); 我可以通过提供bucket名称和密钥来下载文件,但如何仅使用url()下载文件?要启用HTTP访问,必须在S3控制台中将bucket设置为。请注意,除非您设置了正确

在我的应用程序中,我将获得s3文件的url,如: 我必须下载它,然后处理它。 我已经做了:

AmazonS3 s3 = new AmazonS3Client(credentials);
S3Object s3object = s3.getObject(new GetObjectRequest(
bucketName, key));

我可以通过提供bucket名称和密钥来下载文件,但如何仅使用url()下载文件?

要启用HTTP访问,必须在S3控制台中将bucket设置为。请注意,除非您设置了正确的设置,否则这将向web公开您的所有数据


但是,您通过JavaSDK访问的方法不会使用这种类型的连接。它将通过内置的S3协议进行连接。您应该检查IAM角色或策略,以确保您拥有正确的权限(
s3:GetObject
)。如果对象不存在,您还需要
s3:ListBucket
查看404。

您可以通过标准curl/wget下载该文件,就像从Internet下载任何其他文件一样

然而,重要的部分是启用从AmazonS3访问对象的权限。有几个选择:

  • 使对象公开可读:这可以通过控制台或CLI/API完成。但是,任何拥有该URL的人都可以下载它
  • 创建一个,授予所需文件/目录/存储桶的读取权限。但是,同样,任何拥有URL的人都可以访问这些对象
  • 保持对象私有,但使用向URL添加参数的来证明允许下载对象。此预签名URL有时间限制,可以使用当前AWS凭据通过几行代码生成

如果John Rotenstein正确,您可以使用标准curl/wget通过URL下载该文件

如果您想使用Java来实现这一点,下面的内容应该可以实现这一点;利用包装


您可以考虑使用AWS SDK类,如下所示:

URI fileToBeDownloaded = new URI(" https://s3.amazonaws.com/account-update/input.csv"); 

AmazonS3URI s3URI = new AmazonS3URI(fileToBeDownloaded);

S3Object s3Object = s3Client.getObject(s3URI.getBucket(), s3URI.getKey());
从这里开始,您应该能够使用以与代码中显示的s3Object类似的方式获得的s3Object


有关使用此类的更多Java相关AWS SDK示例,请检查使用cli:AWS s3 cp s3://bucket/prefix/key targetlocalfolder

最佳方法是使用预签名的s3 URL来满足您的需要。 您可以将过期时间添加到已签名的URL,然后URL将不可用

有关更多信息,请阅读以下页面:


您不能,但您可以在上载中制作文件附件

例如:

ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentType("application/csv;charset=utf-8");
objectMetadata.setContentDisposition("attachment");
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, arquivo, file, objectMetadata).withCannedAcl(CannedAccessControlList.PublicRead);
amazonS3.putObject(putObjectRequest);

我希望它能有所帮助。

只需在浏览器上输入url,但请确保将
\u0026
替换为
&
,如果您通过curl下载了url,否则您将收到此错误


授权查询参数错误
X-Amz-算法仅支持“AWS4-HMAC-SHA256”

这个问题是关于在http中使用url的,这与常规s3路径在CLI中的工作方式不同。我看到了使用预签名url上载对象的示例。我们如何生成用于下载的预签名URL?@Md.ArafatAlMahmud请创建一个新问题,而不是通过对旧问题的评论提问。在较新的SDK中是否有类似于AmazonS3URI的内容?我使用的是software.amazon.awssdk:s3。在AWSSDKv2上还不可用。你可以照这个做
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentType("application/csv;charset=utf-8");
objectMetadata.setContentDisposition("attachment");
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, arquivo, file, objectMetadata).withCannedAcl(CannedAccessControlList.PublicRead);
amazonS3.putObject(putObjectRequest);