# 通过Java上传下载AWS S3文件,并解决文件数量超过1000的问题
# 1 前言
Amazon S3 (Simple Storage Service)
是很常用的文件存储服务,我们的场景是上游把流水文件放到S3
,我们再从S3
读取并对账。
# 2 初始化S3
首先要获取相关的账号信息,在Amazon
称为:AWSAccessKeyId
和AWSSecretKey
。然后就可以初始化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));
}
这个文件名是S3ObjectSummary
的key
。
# 5 上传文件
上传文件也是非常简单:
s3.putObject(BUCKET_NAME,"s3.pkslow.txt", new File("local.pkslow.txt"));
# 6 总结
还有其它更多场景,可以看官方文档或参考AWS S3 with Java (opens new window)。