AWS S3文件/文件夹删除

蔚落 2023-06-30 08:44 142阅读 0赞
  1. 关于AWS S3的使用相关知识总结可以参考:AWS S3 学习小结。

  2. 以下主要是想总结一下关于S3文件、文件夹如何删除,示例版本是源码里面的java2。

注:要知道,S3不存在子文件夹的概念,而是所有文件都在根目录

假设有/home/files/如下的文件结构:

2020011523185850.png

并且,有这样一个工具类。

  1. package com.bas.util;
  2. import org.apache.commons.lang3.StringUtils;
  3. import software.amazon.awssdk.auth.credentials.*;
  4. import software.amazon.awssdk.core.pagination.sync.SdkIterable;
  5. import software.amazon.awssdk.core.sync.RequestBody;
  6. import software.amazon.awssdk.core.sync.ResponseTransformer;
  7. import software.amazon.awssdk.regions.Region;
  8. import software.amazon.awssdk.services.s3.S3Client;
  9. import software.amazon.awssdk.services.s3.model.*;
  10. import software.amazon.awssdk.services.s3.paginators.ListObjectsV2Iterable;
  11. import software.amazon.awssdk.services.sts.model.Credentials;
  12. import java.io.IOException;
  13. import java.io.UnsupportedEncodingException;
  14. import java.lang.reflect.Field;
  15. import java.net.URLEncoder;
  16. import java.nio.ByteBuffer;
  17. import java.nio.charset.StandardCharsets;
  18. import java.nio.file.Paths;
  19. import java.util.*;
  20. public class S3Utils {
  21. private S3Utils() {
  22. }
  23. public static S3Client builder(String regionStr) {
  24. Region region = Region.US_EAST_1;//default region
  25. if (StringUtils.isNotEmpty(regionStr)) {
  26. region = Region.of(regionStr);
  27. }
  28. return S3Client.builder().region(region).build();
  29. }
  30. public static List<String> listKeysInDirectory(S3Client s3, String bucket, String prefix) {
  31. String delimiter = "/";
  32. if (!prefix.endsWith(delimiter)) {
  33. prefix += delimiter;
  34. }
  35. // Build the list objects request
  36. ListObjectsV2Request listReq = ListObjectsV2Request.builder()
  37. .bucket(bucket)
  38. .prefix(prefix)
  39. .delimiter(delimiter)
  40. .maxKeys(1)
  41. .build();
  42. ListObjectsV2Iterable listRes = s3.listObjectsV2Paginator(listReq);
  43. List<String> keyList = new ArrayList<>();
  44. final String flolder = prefix;
  45. listRes.contents().stream()
  46. .forEach(content -> {
  47. if (!flolder.equals(content.key())) {
  48. keyList.add(content.key());
  49. }
  50. });
  51. return keyList;
  52. }
  53. }

1) 当我们想要删除一个目录下的所有文件,也就是上图的两个txt文件。

  1. public static void deleteS3Folder(S3Client s3, String bucketName, String folderPath) {
  2. ArrayList<ObjectIdentifier> to_delete = new ArrayList<ObjectIdentifier>();
  3. List<String> object_keys = listKeysInDirectory(s3, bucketName, folderPath);
  4. if (null == object_keys || object_keys.size() == 0) {
  5. return;
  6. }
  7. for (String k : object_keys) {
  8. to_delete.add(ObjectIdentifier.builder().key(k).build());
  9. }
  10. try {
  11. DeleteObjectsRequest dor = DeleteObjectsRequest.builder()
  12. .bucket(bucketName)
  13. .delete(Delete.builder().objects(to_delete).build())
  14. .build();
  15. DeleteObjectsResponse response=s3.deleteObjects(dor);
  16. while (!response.sdkHttpResponse().isSuccessful()){
  17. Thread.sleep(100);
  18. }
  19. } catch (S3Exception | InterruptedException e) {
  20. }
  21. System.out.println("delete folder successfully--->"+folderPath);
  22. }

2) 当我们想要删除这个目录的所有文件,也就是图片上所有txt和所有子目录文件。

  1. public static void deleteS3FolderRecursively(S3Client s3, String bucket, String prefix) {
  2. ListObjectsRequest listObjectsRequest = ListObjectsRequest.builder()
  3. .bucket(bucket).build();
  4. ListObjectsResponse objectsResponse = s3.listObjects(listObjectsRequest);
  5. while (true) {
  6. ArrayList<ObjectIdentifier> objects = new ArrayList<>();
  7. for (Iterator<?> iterator = objectsResponse.contents().iterator(); iterator.hasNext(); ) {
  8. S3Object s3Object = (S3Object)iterator.next();
  9. objects.add(ObjectIdentifier.builder().key(s3Object.key()).build());
  10. }
  11. s3.deleteObjects(
  12. DeleteObjectsRequest.builder().bucket(bucket).delete(Delete.builder().objects(objects).build()).build()
  13. );
  14. if (objectsResponse.isTruncated()) {
  15. objectsResponse = s3.listObjects(listObjectsRequest);
  16. continue;
  17. }
  18. break;
  19. };
  20. }

附:

  1. 递归删除目录文件参考:How to delete files recursively from an S3 bucket

发表评论

表情:
评论列表 (有 0 条评论,142人围观)

还没有评论,来说两句吧...

相关阅读

    相关 AWS S3文件/文件夹删除

    1. 关于AWS S3的使用相关知识总结可以参考:[AWS S3 学习小结][AWS S3]。 2. 以下主要是想总结一下关于S3文件、文件夹如何删除,示例版本是源码里面的j

    相关 AWS CLI使用s3

    aws CLI是什么东西,暂且先不去了解,目前的需求是s3. 我在Jenkins上创建一个bucket,然后申请access\_key,然后就可以使用s3来存储数据了。也就是

    相关 AWS S3 学习小结

    1.首先,这个是AWS的开发资源使用文档:[AWS开发文档][AWS],[AWS官网 - S3教程][AWS_ - S3] 2.我们可以通过AWS Cli和Java Api来