当前位置: 首页 > 知识库问答 >
问题:

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

乐正辰阳
2023-03-14

我熟悉AWS Java SDK,我也尝试浏览相应的Javadoc,但我不知道如何创建子目录,即bucket中的目录对象,以及如何将文件上载到它。

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

我尝试了以下方法:

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

这将在第二行引发异常。

一个创建子目录并将文件上传到其中的简短片段将不胜感激。

共有3个答案

鄢翰藻
2023-03-14

在较新版本的SDK中,您可以这样做(不需要创建空的输入流)来创建一个空文件夹:

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());
单于旭东
2023-03-14

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);
}

正如卡萨布兰卡所说,您可以将文件上传到如下目录:

s3.putObject("someBucket", "foo/bar1", file1);

详细阅读整个教程,最重要的是你会找到如何删除目录的信息。

梁华清
2023-03-14

S3中没有“子目录”。桶里有桶,桶里有键。

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

foo/bar1
foo/bar2
foo/bar3
blah/baz1
blah/baz2

然后做一个前缀搜索foo/,你会得到:

foo/bar1
foo/bar2
foo/bar3

请参阅Amazon3.list对象了解更多详细信息。

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

s3.putObject("someBucket", "foo/bar1", file1);
s3.putObject("someBucket", "foo/bar2", file2);
...

然后你可以列出从foo/开始的所有键:

ObjectListing listing = s3.listObjects("someBucket", "foo/");
 类似资料:
  • 创建目录 创建目录 源码/* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * *//* * 程序清单:创建目录 * * 程序会创建一个操作文件的函数并导出到msh命令列表 * 在函数

  • 您好,我想用java创建目录和子目录。我的目录结构是从当前应用程序目录开始的,意思是在当前项目目录中,如下所示。。。 我知道如何创建目录,但我需要创建子目录,我用下面的代码尝试了,下一步应该做什么?

  • 我经常使用标志遍历多个子目录,并提取特定文件或文件类型,而不必单独明确引用每个文件。例子: 这会在我的目标路径中创建与最初检索DLL的源完全相同的目录结构。例如,如果我从上面的检索了一个DLL,那么它会将该DLL放在路径中。 这种行为可以通过以下方式进行修改: 但显然,这意味着我必须单独引用依赖关系中的每个子目录。 因此,64000美元的问题是,如何防止在目标中重新创建相同的目录,而不必显式引用源

  • 创建目录权限 如果你想创建一个目录并授予777权限,你需要怎么做?查看Go的API文档我们可以这样写。 源文件为mkdir.go。 package main import ( "fmt" "os" ) func main() { err := os.MkdirAll("/tmp/gotest/", 0777) if err != nil { panic(er

  • 问题内容: 我正在创建一个简单的程序,尝试从磁盘中读取“ conf / conf.xml”,但是如果此文件或目录不存在,则会创建它们。 我可以使用以下代码执行此操作: 我的问题是,这是否真的是最优雅的方式?需要创建两个简单的路径以在新的子目录中创建新文件似乎多余。 问题答案: 您可以将声明为,而不是。然后,您可以使用,请参见下面的示例: 或者,按原样使用代码,您可以使用:

  • 问题内容: 以前,我要求如何在FileTable不使用File I / OAPI的情况下在其中创建目录。现在,我想为我刚刚创建的父目录创建一个子目录。在插入期间如何分配我的父母?似乎是一个计算列。 这创建了我的父母… 如何在FileTable中为此父级创建子目录? 问题答案: 这是我最终用来创建子目录的原因,因为它不会为我生成新值-它只会解释现有值。 上面的代码块利用了在此发现的默认path_lo