使用 S3 DeleteObject 仅删除文件,保持目录结构不变

Delete only files using S3 DeleteObject keeping directory structure intact

我只需要删除 Amazon S3 中特定目录下的文件, 我的文件路径如下

s3://{s3_bucket}/folder1/sub-folder2/sub-folder3/sub-folder4/sub-folder5/sub-folder6/sub-folder7/sub-folder8/sub-folder9/file.txt

我使用下面的代码从上面的目录结构中单独删除文件

public static void deleteFilesInDirectory(String bucketName, String prefix) {       
        String delimiter = "/";
        if (!prefix.endsWith(delimiter)) {
            prefix += delimiter;
        }
        ListObjectsRequest listObjectsRequest = new ListObjectsRequest()
                .withBucketName(bucketName).withPrefix(prefix);

        ObjectListing objects = s3client.listObjects(listObjectsRequest);       
        for(S3ObjectSummary summary:objects.getObjectSummaries())
        {
            if(!summary.getKey().endsWith("/"))
            {
            s3client.deleteObject(bucketName, summary.getKey());
            }           
        }      
    }

以上代码删除目录sub-folder3/sub-folder4/sub-folder5/sub-folder6/sub-folder7/sub-folder8/sub-folder9/

但是我需要上面的目录结构

我对 api 的理解是否正确,谁能帮我解决这个问题

是否有任何其他方法可以使用 java 仅删除特定 s3 目录下的文件?

S3 没有目录结构。这是一个完全扁平的文件系统。名为 foo/bar 的对象只是:名为 foo/bar 的对象,而不是名为 foo 的目录中名为 bar 的对象。如果您删除了 foo/bar,并且存储桶中没有其他以字符串 foo/ 开头的对象,那么看起来 "directory" foo 已被删除,但它从未存在过首先。因此,要再次创建一个名为 foo/bar 的对象,您不需要先创建一个名为 foo/ 的目录;只需创建一个名为 foo/bar.

的对象

S3中的一个"key"类似于一个文件路径:

http://bucket.s3.amazonaws.com/some/path/to/use ...位于名为 bucket 的存储桶中,其键为 some/path/to/use.

虽然它实际上不是路径,因为没有文件夹。 S3 密钥只是一个大目录(整个存储桶)中文件的文件名。 S3键可以包含/,但没有特殊含义。

换句话说,拥有一个名为 some/object 的对象并不会告诉您关于该对象的任何信息(它可能存在也可能不存在——这两个对象不相关)。

但是,您可以请求具有特定前缀的键,所以我可以说 "give me all keys starting with some/path/to/ and it will return some/path/to/use. It looks like "列出目录”,但它实际上只是请求以特定字符串开头的文件。

编辑:

我查看了 JavaDocs,这是我看到的函数签名(对于 AmazonS3Client):

public void deleteObject(java.lang.String bucketName,
                     java.lang.String key)
              throws AmazonClientException,
                     AmazonServiceException