Amazon Web Services(AWS)S3 Java创建子目录(对象)

Mr.*_*Mr. 24 java amazon-s3 amazon-web-services

我熟悉AWS Java SDK,我也尝试浏览相应的Javadoc,但我无法实现如何创建子目录,即存储桶中的目录对象,以及如何上传文件.

假设bucketNamedirName对应已经存在的存储桶(具有公共权限)和需要在存储桶中创建的新(对象)目录(即bucketName/dirName /)

我尝试过以下方法:

AmazonS3Client s3 = new AmazonS3Client(
    new BasicAWSCredentials(ACCESS_KEY, SECRET_KEY));
s3.createBucket(bucketName + "/" + dirName); //throws exception
Run Code Online (Sandbox Code Playgroud)

这会在第二行引发异常.

我们将非常感谢您创建子目录并将文件上传到其中的简短代码段.

cas*_*nca 43

S3中没有"子目录".有水桶,桶内有钥匙.

您可以使用前缀搜索来模拟传统目录.例如,您可以将以下密钥存储在存储桶中:

foo/bar1
foo/bar2
foo/bar3
blah/baz1
blah/baz2
Run Code Online (Sandbox Code Playgroud)

然后进行前缀搜索foo/,你会得到回复:

foo/bar1
foo/bar2
foo/bar3
Run Code Online (Sandbox Code Playgroud)

有关AmazonS3.listObjects详细信息,请参阅


更新:假设您已有一个现有存储桶,该存储桶下的密钥将包含/:

s3.putObject("someBucket", "foo/bar1", file1);
s3.putObject("someBucket", "foo/bar2", file2);
...
Run Code Online (Sandbox Code Playgroud)

然后,您可以列出以下所示的所有键foo/:

ObjectListing listing = s3.listObjects("someBucket", "foo/");
Run Code Online (Sandbox Code Playgroud)


fil*_*p_j 25

S3在我们的操作系统上没有以传统方式查看目录.以下是创建目录的方法:

public static void createFolder(String bucketName, String folderName, AmazonS3 client) {
    // create meta-data for your folder and set content-length to 0
    ObjectMetadata metadata = new ObjectMetadata();
    metadata.setContentLength(0);

    // create empty content
    InputStream emptyContent = new ByteArrayInputStream(new byte[0]);

    // create a PutObjectRequest passing the folder name suffixed by /
    PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName,
                folderName + SUFFIX, emptyContent, metadata);

    // send request to S3 to create folder
    client.putObject(putObjectRequest);
}
Run Code Online (Sandbox Code Playgroud)

正如卡萨布兰卡已经说过你可以将文件上传到这样的目录:

s3.putObject("someBucket", "foo/bar1", file1);
Run Code Online (Sandbox Code Playgroud)

阅读整个教程这里的细节,而最重要的是,你会发现信息如何删除目录.


jal*_*gar 6

在较新版本的 SDK 中,您可以执行类似以下操作(无需创建空的 InputStream)来创建空文件夹:

String key = parentKey + newFolderName;
if (!StringUtils.endsWith(key, "/")) {
    key += "/";
}

PutObjectRequest putRequest = PutObjectRequest.builder()
        .bucket(parent.getBucket())
        .key(key)
        .acl("public-read")
        .build();
s3Client.putObject(putRequest, RequestBody.empty());
Run Code Online (Sandbox Code Playgroud)