web-dev-qa-db-ja.com

アマゾンウェブサービス(AWS)S3 Javaサブディレクトリを作成(オブジェクト)

AWS Java SDK に精通していますが、対応する Javadoc も参照しようとしましたが、作成方法を理解できませんでしたサブディレクトリ、つまりバケット内のディレクトリオブジェクトと、それにファイルをアップロードする方法。

bucketNamedirNameは、既存のバケット(パブリック権限を持つ)と、バケット内に作成する必要がある新しい(オブジェクト)ディレクトリ(つまり、bucketName/dirName /)に対応していると想定します

私は以下を試しました:

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

2行目に例外がスローされます。

サブディレクトリを作成し、そこにファイルをアップロードする短いスニペットは、高く評価されます。

27
Mr.

S3には「サブディレクトリ」はありません。バケットがあり、バケット内にキーがあります。

プレフィックス検索を使用して、従来のディレクトリをエミュレートできます。たとえば、次のキーをバケットに保存できます。

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

次にfoo/のプレフィックス検索を実行すると、次のようになります。

foo/bar1
foo/bar2
foo/bar3

詳細は AmazonS3.listObjects を参照してください。


更新:すでに既存のバケットがあると仮定すると、そのバケットの下のキーには/が含まれます。

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

次に、foo/で始まるすべてのキーをリストできます。

ObjectListing listing = s3.listObjects("someBucket", "foo/");
41
casablanca

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

Casablancaがすでに言ったように、次のようなディレクトリにファイルをアップロードできます:

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

詳細については、チュートリアル全体 こちら をお読みください。最も重要なことは、ディレクトリを削除する方法に関する情報を見つけることです。

25
filip_j

フォルダを作成する場合は、次のキーを使用してputコマンドを使用し、folder1を作成する必要があります。

バケットのルート-> folder1/folder1_ $ folder $

パスfolder2/folder3 /-> folder2/folder3/folder1/folder1_ $ folder $

常にall_previous_folders/folderName/folderName_ $ folder $です。

0
Panuf

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());
0
jalogar