我在运行AmazonS3的listObjects(..)方法时遇到了一些戏剧性问题。我确定我的凭据设置正确,因为我可以使用s3Client.getObject(..)下载单个文件。日志读取::
com.amazonaws.SdkClientException: Failed to parse XML document with handler class
com.amazonaws.services.s3.model.transform.XmlResponsesSaxParser$ListObjectsV2Handler
Caused by: org.xml.sax.SAXParseException: Premature end of file.
据我所知,listObjects(..)确实包含了一些包含元数据的xml。重现错误的代码非常简单。我在这里看不出任何错误:(
ListObjectsRequest listObjectsRequest = new ListObjectsRequest() .withBucketName(ENV.getProperty(" cloud.aws.s3.bucket&#34));
ObjectListing objectListing = amazonS3Client.listObjects(listObjectsRequest);
以下是我正在使用的spring-cloud-aws-context的版本::
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-aws-context</artifactId
<version>1.2.1.RELEASE</version>
</dependency>
有人有任何见解吗?或者知道这个问题?
提前致谢:)
答案 0 :(得分:1)
好的,我找到了解决方案!问题在于权限,显然listObjects(..)需要它自己的权限集。特别是&#39; ListBucket&#39;必须启用操作。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:ListBucket"],
"Resource": ["arn:aws:s3:::test"]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": ["arn:aws:s3:::test/*"]
}
]
}
另一个问题是我给我的桶名称的方式。我使用了'mybucket / some / prefix / before / files&#39;。我把它更正为了#mybucket&#39;。前缀仅与getObject(..)一起使用,如下所示:
GetObjectRequest getObjectRequest = new
GetObjectRequest("mybucket/some/prefix/before/files", key);
S3Object s3Object = amazonS3Client.getObject(getObjectRequest);
答案 1 :(得分:1)
我遇到了确切的异常 *无法通过处理程序类解析XML文档 *,并且该失败并不是真正的描述性事件。 但是我的问题不是权限,而是试图直接列出存储桶子文件夹。
我试图从/ bucketName / subFolder / subFolder2中列出对象,而不仅仅是/ bucketName和前缀。
这会导致上面的异常(在Scala中):
val path = "/bucketName/myFolder/subFolder"
val results = s3Client.listObjectsV2(path)
我需要分离存储桶名称和前缀,然后使用ListObjectRequestV2
val path = "/bucketName/myFolder/subFolder"
val bucketName = "bucketName"
val prefix = "myFolder/subFolder"
val listObjectsRequest = new
val ListObjectsV2Request().withBucketName(bucketName).withPrefix(prefix)
val results = s3Client.listObjectsV2(path)