使用Scala从S3存储桶下载所有文件

3
我尝试了下面的代码成功下载一个文件,但无法下载所有文件列表。
client.getObject(
new GetObjectRequest(bucketName, "TestFolder/TestSubfolder/Psalm/P.txt"),
new File("test.txt"))          

谢谢您提前的帮助。

更新 我尝试了下面的代码,但是得到的是目录列表,我想要的是文件列表。

val listObjectsRequest = new ListObjectsRequest().
withBucketName("tivo-hadoop-dev").
withPrefix("prefix").
withDelimiter("/")
client.listObjects(listObjectsRequest).getCommonPrefixes

在这里寻求帮助之前,您需要尝试一些东西。您尝试过读取所有文件的方法吗?出现了什么错误? - Kannaiyan
更新了问题,附上我尝试过的内容,请@kannaiyan帮忙。 - Aryan Singh
2个回答

2

这是一个简单的事情,但在得出以下答案之前,我像疯了一样挣扎。
我找到了一段Java代码并相应地改成了Scala代码,然后它就可以工作了。

 val client = new AmazonS3Client(credentials)
         val listObjectsRequest = new ListObjectsRequest().
         withBucketName("bucket-name").
         withPrefix("path/of/dir").
         withDelimiter("/")

 var objects = client.listObjects(listObjectsRequest);
 do {
     for (objectSummary <- objects.getObjectSummaries()) {
         var key = objectSummary.getKey()
                 println(key)
                 var arr=key.split("/")
                 var file_name = arr(arr.length-1)
                 client.getObject(
                         new GetObjectRequest("bucket" , key),
                         new File("some/path/"+file_name))
     }
     objects = client.listNextBatchOfObjects(objects);
 } while (objects.isTruncated())

0
以下代码非常快速和实用,特别是当您想下载特定本地目录下的所有对象时。它维护了与 S3 前缀层次结构完全相同的文件。
val xferMgrForAws:TransferManager = TransferManagerBuilder.standard().withS3Client(awsS3Client).build();
var objectListing:ObjectListing = null;
objectListing = awsS3Client.listObjects(awsBucketName, prefix);
val summaries:java.util.List[S3ObjectSummary] = objectListing.getObjectSummaries();
if(summaries.size() > 0) {
  val xfer:MultipleFileDownload = xferMgrForAws.downloadDirectory(awsBucketName, prefix, new File(localDirPath));
  xfer.waitForCompletion();
  println("All files downloaded successfully!")
} else {
   println("No object present in the bucket !");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接