在aws存储桶中列出对象

时间:2014-02-02 02:19:43

标签: java amazon-web-services amazon-s3

我试图打印存储桶中的所有对象,但是我收到错误。

  

线程“main”中的异常com.amazonaws.services.s3.model.AmazonS3Exception:状态代码:301,AWS服务:Amazon S3,AWS请求ID:758A7CBF1A29FD74,AWS错误代码:PermanentRedirect,AWS错误消息:存储桶您尝试访问必须使用指定的端点进行寻址。请将所有将来的请求发送到此端点。,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

有谁知道我错过了什么?

2 个答案:

答案 0 :(得分:3)

您的水桶“apireleasecandidate1”似乎不在us-west-1区域。我认为这是在美国经典区域。您应修改代码以删除setRegion()调用。

答案 1 :(得分:2)

对于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))
}

要调用上面的curry 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()将{{1}}与许多其他功能结合起来Monads in Functional Programming