在Java中使用AWS SDK和MinIO操作S3及云存储
兼容Amazon S3(Simple Storage Service)协议的云对象存储已成为存储非结构化数据(如图像、视频、日志、备份和构建产物)的事实标准。在Java中,与这类存储交互的主要工具是AWS SDK for Java(S3模块)。然而,对于本地开发、测试或使用自托管解决方案,通常使用MinIO——一个高性能的S3兼容存储,并配有自身的Java客户端。本文将介绍这两种方法。
1. 准备与依赖引入
首先,在您的pom.xml(Maven)中添加依赖:
<dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3</artifactId> <version>2.30.0</version></dependency>
<!-- 用于MinIO(AWS SDK的替代方案) --><dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>8.5.17</version></dependency>2. 创建S3客户端
我们来看两种创建客户端的方式:用于Amazon S3(AWS)和用于MinIO(本地/自定义存储)。
2.1. Amazon S3客户端(AWS SDK)
使用静态构建器,指定区域和认证方式(例如,通过环境变量或IAM配置文件)。
import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.s3.S3Client;
public class AwsS3Example { public static S3Client createAwsS3Client() { return S3Client.builder() .region(Region.EU_CENTRAL_1) // 法兰克福 .build(); // 使用默认的提供商链 }}2.2. MinIO客户端
MinIO需要显式指定endpoint、access key和secret key。
import io.minio.MinioClient;
public class MinioExample { public static MinioClient createMinioClient() { return MinioClient.builder() .endpoint("http://localhost:9000") .credentials("minioadmin", "minioadmin") .build(); }}3. 存储桶与对象的基本操作
无论选择哪个客户端,S3的操作逻辑都是通用的。我们来看关键场景。
3.1. 检查存储桶是否存在并创建
// AWS SDKpublic boolean bucketExists(S3Client s3, String bucketName) { return s3.headBucket(HeadBucketRequest.builder() .bucket(bucketName) .build()) .sdkHttpResponse().isSuccessful();}
// MinIO SDKpublic boolean bucketExists(MinioClient minio, String bucketName) { return minio.bucketExists(BucketExistsArgs.builder() .bucket(bucketName) .build());}
// 创建存储桶(AWS)s3.createBucket(CreateBucketRequest.builder() .bucket("my-unique-bucket-123") .createBucketConfiguration( CreateBucketConfiguration.builder() .locationConstraint("eu-central-1") .build()) .build());
// 创建存储桶(MinIO)minio.makeBucket(MakeBucketArgs.builder() .bucket("my-local-bucket") .build());3.2. 上传文件(Upload)
从本地路径或数据流上传文件。
// AWS SDK - 从文件上传s3.putObject(PutObjectRequest.builder() .bucket("my-bucket") .key("uploads/report.pdf") .build(), Paths.get("/local/path/report.pdf"));
// MinIO SDK - 从InputStream上传try (InputStream is = new FileInputStream("/local/path/photo.jpg")) { minio.putObject(PutObjectArgs.builder()