我试图打印存储桶中的所有对象,但出现错误。
Exception in thread "main" com.amazonaws.services.s3.model.AmazonS3Exception: Status Code: 301, AWS Service: Amazon S3, AWS Request ID: 758A7CBF1A29FD74, AWS Error Code: PermanentRedirect, AWS Error Message: The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint., S3
目前我只有以下代码:
public class S3Download {
/**
* @param args
*/
public static void main(String[] args) {
AmazonS3 s3 = new AmazonS3Client(new ClasspathPropertiesFileCredentialsProvider());
Region usWest2 = Region.getRegion(Regions.US_WEST_2);
s3.setRegion(usWest2);
String bucketName = "apireleasecandidate1";
ListObjectsRequest listObjectRequest = new ListObjectsRequest().withBucketName(bucketName);
ObjectListing objectListing;
do{
objectListing = s3.listObjects(listObjectRequest);
for(S3ObjectSummary objectSummary : objectListing.getObjectSummaries()){
System.out.println(" - " + objectSummary.getKey() + " " + "(size = " +
objectSummary.getSize() + ")");
}
listObjectRequest.setMarker(objectListing.getNextMarker());
}while(objectListing.isTruncated());
}
}
我找到了 this solution在亚马逊的网站上。
有人知道我错过了什么吗?
最佳答案
对于 Scala 开发人员,这里是使用官方 AWS SDK for Java 对 AmazonS3 存储桶的内容执行完整扫描和映射 的递归函数
import com.amazonaws.services.s3.AmazonS3Client
import com.amazonaws.services.s3.model.{S3ObjectSummary, ObjectListing, GetObjectRequest}
import scala.collection.JavaConversions.{collectionAsScalaIterable => asScala}
def map[T](s3: AmazonS3Client, bucket: String, prefix: String)(f: (S3ObjectSummary) => T) = {
def scan(acc:List[T], listing:ObjectListing): List[T] = {
val summaries = asScala[S3ObjectSummary](listing.getObjectSummaries())
val mapped = (for (summary <- summaries) yield f(summary)).toList
if (!listing.isTruncated) mapped.toList
else scan(acc ::: mapped, s3.listNextBatchOfObjects(listing))
}
scan(List(), s3.listObjects(bucket, prefix))
}
要调用上述柯里化(Currying)的map()
函数,只需传递已经构建(并正确初始化)的AmazonS3Client对象(引用官方AWS SDK for Java API Reference),存储桶名称和前缀名称第一个参数列表。还要传递要应用的函数 f()
,以映射第二个参数列表中的每个对象摘要。
例如
map(s3, bucket, prefix)(s => println(s))
将打印所有文件
val tuple = map(s3, bucket, prefix)(s => (s.getKey, s.getOwner, s.getSize))
将返回该桶/前缀中的(key, owner, size)
元组的完整列表
val totalSize = map(s3, "bucket", "prefix")(s => s.getSize).sum
将返回其内容的总大小(注意在表达式末尾应用的附加 sum()
折叠函数 ;-)
您可以将 map()
与许多其他函数结合使用,就像您通常通过 Monads in Functional Programming 接近的那样
关于java - 列出 aws 存储桶中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21506270/