猿问

使用 sdk 计算 AWS S3 存储桶中的对象时计数不正确

我正在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?


慕田峪7331174
浏览 230回答 2
2回答

元芳怎么了

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/.如何解决这个问题?以下是一些选项:不要创建目录。通过在给定路径中创建对象,让它们自动“出现”。这样,就不会出现目录名称的零长度文件。更改您的代码以忽略零长度对象。

慕斯709654

我做了以下代码更改,现在我得到了正确的计数val reqAws:ListObjectsV2Request = new ListObjectsV2Request().withBucketName(awsBucketName).withPrefix(prefixForAws);var resultAws:ListObjectsV2Result = null;var totalFilesInAws:Int = 0;do {&nbsp; resultAws = awsS3Client.listObjectsV2(reqAws);&nbsp; val summariesForAws:java.util.List[S3ObjectSummary] = resultAws.getObjectSummaries()&nbsp; for(k <- summariesForAws.asScala) {&nbsp; &nbsp; if(!(k.getKey.toString().endsWith("/"))) {&nbsp; &nbsp; &nbsp; totalFilesInAws+= 1;&nbsp; &nbsp; }&nbsp; }&nbsp; val token:String = resultAws.getNextContinuationToken();&nbsp; reqAws.setContinuationToken(token);} while (resultAws.isTruncated());
随时随地看视频慕课网APP

相关分类

Java
我要回答