Неправильный счет при подсчете объектов в корзине AWS S3 с использованием SDK - PullRequest
0 голосов
/ 18 октября 2018

Я подсчитываю количество объектов в AWS S3 корзине, используя Scala следующим образом:

val reqAws:ListObjectsV2Request = new ListObjectsV2Request().withBucketName(awsBucketName).withPrefix(prefixForAws);
var resultAws:ListObjectsV2Result = null;
var totalFilesInAws:Int = 0;
do {
  resultAws = awsS3Client.listObjectsV2(reqAws);
  val summariesForAws:java.util.List[S3ObjectSummary] = resultAws.getObjectSummaries()
  totalFilesInAws = totalFilesInAws + summariesForAws.size().toInt
  val token:String = resultAws.getNextContinuationToken();
  reqAws.setContinuationToken(token);
} while (resultAws.isTruncated());

Однако он дает мне count и для тех префиксов, которые не содержат никаких объектов.

Например, если мой префикс a/b/c и мой S3 имеет следующую структуру:

bucketName/a/b/c/d/obj1

bucketName/a/b/c/e/obj2

bucketName/a/b/c/f/

Теперь мы видим, что a/b/c/f не имеет объекта, но a/b/c/d и a/b/c/eесть объекты, поэтому count должно быть 2, но мой код дает значение 3.

Как мне изменить мой код, чтобы получить правильный count?

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Я сделал следующие изменения кода, и теперь я получаю правильный счет

val reqAws:ListObjectsV2Request = new ListObjectsV2Request().withBucketName(awsBucketName).withPrefix(prefixForAws);
var resultAws:ListObjectsV2Result = null;
var totalFilesInAws:Int = 0;
do {
  resultAws = awsS3Client.listObjectsV2(reqAws);
  val summariesForAws:java.util.List[S3ObjectSummary] = resultAws.getObjectSummaries()
  for(k <- summariesForAws.asScala) {
    if(!(k.getKey.toString().endsWith("/"))) {
      totalFilesInAws+= 1;
    }
  }
  val token:String = resultAws.getNextContinuationToken();
  reqAws.setContinuationToken(token);
} while (resultAws.isTruncated());
0 голосов
/ 18 октября 2018

Amazon S3 на самом деле не имеет папок / каталогов.

Например, вы можете запустить эту команду:

aws s3 cp foo.txt s3://my-bucket/a/b/c/foo.txt

Это работает, даже если путь a/b/c не существует.

Затем, если этот объект затем удаляется, путь исчезает.

Это потому, что имя файла ('Key') каждого объекта - полный путь .Amazon S3 делает его «похожим» на каталоги, но на самом деле их нет.

Итак, что происходит, когда вы создаете папку?Ответ заключается в том, что система создает объект нулевой длины с тем же именем, что и путь.

В вашем случае существует объект нулевой длины с именем /a/b/c/f/.Это приводит к появлению каталога (даже если такого понятия как каталог нет).

Хотя a/b/c/f/ может не содержать объект, является объектомназывается a/b/c/f/.

Как это решить?Вот несколько вариантов:

  • Не создавать каталоги .Пусть они автоматически «появляются» через создание объектов по заданному пути.Таким образом, не будет файлов нулевой длины с именем каталога.
  • Измените код , чтобы игнорировать объекты нулевой длины.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...