LarryDpk
发布于 2020-08-21 / 4043 阅读
0

通过Java上传下载AWS S3文件,并解决文件数量超过1000的问题

1 前言

Amazon S3 (Simple Storage Service)是很常用的文件存储服务,我们的场景是上游把流水文件放到S3,我们再从S3读取并对账。

2 初始化S3

首先要获取相关的账号信息,在Amazon称为:AWSAccessKeyIdAWSSecretKey。然后就可以初始化S3客户端了。代码如下:

private static AmazonS3 initS3Client() {
  AWSCredentials credentials = new BasicAWSCredentials(ACCESS_KEY, SECRET_KEY);
  return AmazonS3ClientBuilder.standard()
    .withCredentials(new AWSStaticCredentialsProvider(credentials))
    .withRegion(Regions.AP_SOUTHEAST_1)
    .build();
}

这里需要指定Region,即Bucket所在的区域。

3 获取文件列表

当我们在Bucket上放了许多文件后,需要查询文件列表,则方法如下:

ObjectListing objects = s3.listObjects(BUCKET_NAME);

但是,如果这个Bucket的文件超过一千个,那上述方法只能获取1000个。想要列出所有,要使用以下方法:

private static List<S3ObjectSummary> listAllS3Obj(AmazonS3 s3) {
  ListObjectsRequest request = new ListObjectsRequest();
  request.setBucketName(BUCKET_NAME);
  request.setPrefix(prefix);

  ObjectListing objects = s3.listObjects(request);
  List<S3ObjectSummary> keyList = new ArrayList<>(objects.getObjectSummaries());

  while (objects.isTruncated()) {
    objects = s3.listNextBatchOfObjects(objects);
    keyList.addAll(objects.getObjectSummaries());
  }

  return keyList;
}

通过循环,不断获取。还能指定前缀prefix匹配。

4 下载文件

下载文件比较简单,知道文件名就可以了,如下:

private static void downloadOneFromS3(AmazonS3 s3, String filename) throws IOException {
  S3Object s3object = s3.getObject(BUCKET_NAME, filename);
  S3ObjectInputStream inputStream = s3object.getObjectContent();
  FileUtils.copyInputStreamToFile(inputStream, new File(DOWNLOAD_FILES_FOLDER + filename));
}

这个文件名是S3ObjectSummarykey

5 上传文件

上传文件也是非常简单:

s3.putObject(BUCKET_NAME,"s3.pkslow.txt", new File("local.pkslow.txt"));

6 总结

还有其它更多场景,可以看官方文档或参考AWS S3 with Java