首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在aws桶中列出对象

在aws桶中列出对象
EN

Stack Overflow用户
提问于 2014-02-02 02:19:43
回答 2查看 4.3K关注 0票数 4

我试图打印桶中的所有对象,但我得到了一个错误。

线程“主”com.amazonaws.services.s3.model.AmazonS3Exception:状态代码中的异常: 301,AWS服务: S3,AWS请求ID: 758A7CBF1A29FD74,AWS错误代码: PermanentRedirect,AWS错误消息:您试图访问的桶必须使用指定的端点来处理。请将所有未来的请求发送到此端点.,S3

目前,我只有以下代码:

代码语言:javascript
复制
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());
    }

}

我在亚马逊的网站上找到了这个解决方案

有人知道我错过了什么吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-05 12:38:18

对于Scala开发人员来说,这里使用正式的执行AmazonS3桶内容的完整扫描和映射AWS SDK for Java是递归函数。

代码语言:javascript
复制
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))
}

要调用上述map()函数,只需在第一个参数列表中传递已经构造(并正确初始化的) AmazonS3Client对象(引用正式的AWS引用)、桶名和前缀名称。还传递要应用于映射第二个参数列表中的每个对象摘要的函数f()

例如

代码语言:javascript
复制
map(s3, bucket, prefix)(s => println(s))

会打印所有的文件

代码语言:javascript
复制
val tuple = map(s3, bucket, prefix)(s => (s.getKey, s.getOwner, s.getSize))

将返回桶/前缀中(key, owner, size)元组的完整列表。

代码语言:javascript
复制
val totalSize = map(s3, "bucket", "prefix")(s => s.getSize).sum

将返回其内容的总大小(请注意在表达式末尾应用的附加sum()折叠函数;-)

您可以将map()与许多其他函数结合起来,就像通常通过函数式程序设计中的一元进行的那样

票数 3
EN

Stack Overflow用户

发布于 2014-02-05 18:24:08

看来你的桶"apireleasecandidate1“不是在美国西部-1地区。我认为这是在美国的经典地区。您应该修改代码以删除setRegion()调用。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21506270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档