Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 亚马逊S3上市“;目录“;_Java_Amazon S3 - Fatal编程技术网

Java 亚马逊S3上市“;目录“;

Java 亚马逊S3上市“;目录“;,java,amazon-s3,Java,Amazon S3,我已经通过AWS S3管理控制台在S3中创建了一个层次结构。如果我运行以下代码来列出bucket: AmazonS3 s3 = new AmazonS3Client(CRED); ListObjectsRequest lor = new ListObjectsRequest() .withBucketName("myBucket") .withPrefix("code/"); Ob

我已经通过AWS S3管理控制台在S3中创建了一个层次结构。如果我运行以下代码来列出bucket:

AmazonS3 s3 = new AmazonS3Client(CRED);
ListObjectsRequest lor = new ListObjectsRequest()
                             .withBucketName("myBucket")
                             .withPrefix("code/");
ObjectListing objectListing = s3.listObjects(lor);
for (S3ObjectSummary summary: objectListing.getObjectSummaries()) {
    System.out.println(summary.getKey());
}
我得到:

code/ 
code/03000000-0001-0000-0000-000000000000/ 
code/03000000-0001-0000-0000-000000000000/special.js 
code/03000000-0001-0000-0000-000000000000/test.js 
code/03000000-0002-0000-0000-000000000000/ 
这正是我所期望的。如果我添加了一个分隔符,这样我就只能直接在“code/”下列出内容,现在我就不会得到任何子“目录”

将上面的行(末尾添加withDelimiter())更改为:

我现在只得到:

code/ 

我知道S3没有“目录”,而是有分隔键,但这种行为似乎很奇怪?我如何列出仅在“代码”下方的内容?

其中的键没有内容S3将其视为“常用前缀”:

公共列表getCommonPrefixes()

获取此对象列表中包含的公用前缀。普通的 只有在原始文件中指定了分隔符时,才会出现前缀 请求

每个公共前缀表示S3存储桶中具有 已从对象摘要结果中压缩和省略。这 允许应用程序按层次结构组织和浏览其密钥, 类似于文件系统将文件组织到目录中的方式

例如,考虑一个包含以下键的桶:

“foo/bar/baz”
“foo/bar/bash”
“foo/bar/bang”
“foo/boo”

如果调用带有前缀=“foo/”和分隔符=“/”的listObjects 在这个bucket中,返回的S3ObjectList将在 通用前缀列表(“foo/bar/”)和开头的任何键 具有该通用前缀的对象将包含在对象摘要列表中

返回:此对象列表中包含的常用前缀列表, 如果找不到常用前缀,则可能是空列表


您可以指定列出存储桶的任何目录层次结构。当前缀为​​设置为“”或“/”,表示bucket的一级目录。设置特定子目录时,将显示该子目录的键列表

参考,并添加了一些修改

  public List<String> listKeysInBucket(String bucketName, String prefix) {
    Boolean isTopLevel = false;
    String delimiter = "/";
    if(prefix == "" || prefix == "/") {
      isTopLevel = true;
    }
    if (!prefix.endsWith(delimiter)) {
      prefix += delimiter;
    }

    ListObjectsRequest listObjectsRequest = null;
    if (isTopLevel) {
      listObjectsRequest =
          new ListObjectsRequest().withBucketName(bucketName).withDelimiter(delimiter);
    } else {
      listObjectsRequest = new ListObjectsRequest().withBucketName(bucketName).withPrefix(prefix)
          .withDelimiter(delimiter);
    }
    ObjectListing objects = s3Client.listObjects(listObjectsRequest);
    return objects.getCommonPrefixes();
  }
公共列表ListKeyInBucket(字符串bucketName,字符串前缀){
布尔isTopLevel=false;
字符串分隔符=“/”;
如果(前缀=“”| |前缀=“”/“”){
isTopLevel=真;
}
if(!prefix.endsWith(分隔符)){
前缀+=分隔符;
}
ListObjectsRequest ListObjectsRequest=null;
如果(isTopLevel){
listObjectsRequest=
新建ListObjectsRequest()。withBucketName(bucketName)。withDelimiter(delimiter);
}否则{
listObjectsRequest=新建listObjectsRequest()。withBucketName(bucketName)。withPrefix(prefix)
.带分隔符(分隔符);
}
ObjectListing objects=s3Client.listObjects(listObjectsRequest);
返回objects.getCommonPrefixes();
}
下面的代码让我列出了s3中的所有目录。
私有静态字符串bucket_name=“”;
私有静态字符串secret_key=“”;
私有静态字符串访问_key=“”;
私有静态字符串Regions=Regions.SELECT\u region;
公共静态void main(字符串[]args){
System.out.println(listKeysInBucket(bucket_name,“/”);
}
公共静态列表listKeysInBucket(字符串bucketName,字符串前缀){
布尔isTopLevel=false;
字符串分隔符=“/”;
if(前缀.equals(“”| |前缀.equals(分隔符)){
isTopLevel=真;
}
if(!prefix.endsWith(分隔符)){
前缀+=分隔符;
}
ListObjectsRequest ListObjectsRequest=null;
如果(isTopLevel){
listObjectsRequest=新建listObjectsRequest()。带bucketName(bucketName)。带分隔符(分隔符);
}否则{
listObjectsRequest=新建listObjectsRequest()。withBucketName(bucketName)。withPrefix(prefix)
.带分隔符(分隔符);
}
ObjectListing objects=s3Client().listObjects(listObjectsRequest);
返回objects.getCommonPrefixes();
}
公共静态AmazonS3 s3Client(){
AWSCredentials s3Configs=新的基本WSCredentials(访问密钥、保密密钥);
返回AmazonS3ClientBuilder.standard()
.withCredentials(新AWSStaticCredentialsProvider(s3Configs))。withRegion(region)
.build();
}

你试过带前缀(“code”)的
吗?
(省略斜杠)是的,那对我没有任何帮助。根据AWS doco,您需要在前缀后面添加尾随分隔符。这个答案更完整,它返回foo/、foo/boo,并且在常用前缀中有foo/bar。这是正确的吗?有一个例子是这个答案:这里也可以找到一个代码示例
  public List<String> listKeysInBucket(String bucketName, String prefix) {
    Boolean isTopLevel = false;
    String delimiter = "/";
    if(prefix == "" || prefix == "/") {
      isTopLevel = true;
    }
    if (!prefix.endsWith(delimiter)) {
      prefix += delimiter;
    }

    ListObjectsRequest listObjectsRequest = null;
    if (isTopLevel) {
      listObjectsRequest =
          new ListObjectsRequest().withBucketName(bucketName).withDelimiter(delimiter);
    } else {
      listObjectsRequest = new ListObjectsRequest().withBucketName(bucketName).withPrefix(prefix)
          .withDelimiter(delimiter);
    }
    ObjectListing objects = s3Client.listObjects(listObjectsRequest);
    return objects.getCommonPrefixes();
  }
This below code worked for me to list all directories in s3.

private static String bucket_name = "";
private static String secret_key = "";
private static String access_key = "";
private static String Regions region = Regions.SELECT_REGION;

public static void main(String[] args) {
        System.out.println(listKeysInBucket(bucket_name, "/"));
    }

    public static List<String> listKeysInBucket(String bucketName, String prefix) {
        boolean isTopLevel = false;
        String delimiter = "/";
        if (prefix.equals("") || prefix.equals(delimiter)) {
            isTopLevel = true;
        }
        if (!prefix.endsWith(delimiter)) {
            prefix += delimiter;
        }

        ListObjectsRequest listObjectsRequest = null;
        if (isTopLevel) {
            listObjectsRequest = new ListObjectsRequest().withBucketName(bucketName).withDelimiter(delimiter);
        } else {
            listObjectsRequest = new ListObjectsRequest().withBucketName(bucketName).withPrefix(prefix)
                    .withDelimiter(delimiter);
        }

        ObjectListing objects = s3Client().listObjects(listObjectsRequest);
        return objects.getCommonPrefixes();
    }

    public static AmazonS3 s3Client() {
        AWSCredentials s3Configs = new BasicAWSCredentials(access_key,secret_key);
        return AmazonS3ClientBuilder.standard()
                .withCredentials(new AWSStaticCredentialsProvider(s3Configs)).withRegion(region )
                .build();
    }