Java SDK
RustFS 与 S3 兼容。本指南演示了如何使用 AWS SDK for Java v2 与 RustFS 配合使用。
1. 设置
1.1 Maven 项目设置
创建一个新的 Maven 项目
rustfs-java-s3-demo/
├── pom.xml
└── src/
└── main/
└── java/
└── com/
└── example/
└── RustfsS3Example.java1.2 添加依赖项
在 pom.xml 中添加 AWS SDK 依赖项
xml
<dependencies>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3</artifactId>
<version>2.25.27</version>
</dependency>
</dependencies>建议使用 AWS SDK v2,它功能更全面,并支持 async、reactive 等模式。
2. 连接到 RustFS
2.1 初始化客户端
java
package com.example;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.*;
import java.net.URI;
import java.nio.file.Paths;
public class RustfsS3Example {
public static void main(String[] args) {
// 1. Initialize S3 client
S3Client s3 = S3Client.builder()
.endpointOverride(URI.create("http://192.168.1.100:9000")) // RustFS address
.region(Region.US_EAST_1) // RustFS does not validate regions
.credentialsProvider(
StaticCredentialsProvider.create(
AwsBasicCredentials.create("rustfsadmin", "rustfssecret")
)
)
.forcePathStyle(true) // Required for RustFS compatibility
.build();
// 2. Create Bucket
String bucket = "my-bucket";
try {
s3.createBucket(CreateBucketRequest.builder().bucket(bucket).build());
System.out.println("Bucket created: " + bucket);
} catch (BucketAlreadyExistsException | BucketAlreadyOwnedByYouException e) {
System.out.println("Bucket already exists.");
}
// 3. Upload file
s3.putObject(
PutObjectRequest.builder().bucket(bucket).key("hello.txt").build(),
Paths.get("hello.txt")
);
System.out.println("Uploaded hello.txt");
// 4. Download file
s3.getObject(
GetObjectRequest.builder().bucket(bucket).key("hello.txt").build(),
Paths.get("downloaded-hello.txt")
);
System.out.println("Downloaded hello.txt");
// 5. List objects
ListObjectsV2Response listResponse = s3.listObjectsV2(ListObjectsV2Request.builder().bucket(bucket).build());
listResponse.contents().forEach(obj -> System.out.println("Found object: " + obj.key()));
// 6. Delete object
s3.deleteObject(DeleteObjectRequest.builder().bucket(bucket).key("hello.txt").build());
System.out.println("Deleted hello.txt");
// 7. Delete bucket (optional)
// s3.deleteBucket(DeleteBucketRequest.builder().bucket(bucket).build());
}
}3. 常见问题及故障排除
| 问题 | 原因 | 解决方案 |
|---|---|---|
S3Exception: 301 Moved Permanently | 未启用路径样式或区域错误 | 设置 .forcePathStyle(true) 并为区域使用任何值 |
ConnectException: Connection refused | RustFS 未启动或端口不正确 | 检查 RustFS 状态和端口 |
403 Forbidden | AccessKey / SecretKey 错误 | 检查身份验证配置 |
| 上传失败,无响应 | SDK 默认为 HTTPS,RustFS 仅支持 HTTP(或需要证书) | 使用 http:// 地址并配置 endpointOverride |
4. 附录
4.1 Maven 打包和运行
打包项目
bash
mvn clean package执行
bash
java -cp target/rustfs-java-s3-demo-1.0-SNAPSHOT.jar com.example.RustfsS3Example4.2 RustFS 配置建议
- 当服务使用 HTTP 协议时,请确保禁用 SSL 验证。
- 启用 CORS 支持(如果用于 Web 前端)。
- 建议设置
max_object_size和max_part_size等限制,以防止大文件传输失败。
好的,下面是 **RustFS AWS S3 Java SDK 高级功能示例补充**,包括
- 预签名 URL 的生成和使用
- 分片上传的完整流程
5. Java 高级功能示例
5.1 生成和使用预签名 URL
预签名 URL 允许客户端临时访问私有对象,而无需暴露凭证,广泛用于浏览器直接上传或下载文件的场景。
5.1.1 生成下载链接 (GET)
java
import software.amazon.awssdk.services.s3.presigner.S3Presigner;
import software.amazon.awssdk.services.s3.presigner.model.GetObjectPresignRequest;
S3Presigner presigner = S3Presigner.builder()
.endpointOverride(URI.create("http://192.168.1.100:9000"))
.region(Region.US_EAST_1)
.credentialsProvider(
StaticCredentialsProvider.create(
AwsBasicCredentials.create("rustfsadmin", "rustfssecret")
)
)
.build();
GetObjectRequest getObjectRequest = GetObjectRequest.builder()
.bucket("my-bucket")
.key("hello.txt")
.build();
GetObjectPresignRequest presignRequest = GetObjectPresignRequest.builder()
.getObjectRequest(getObjectRequest)
.signatureDuration(Duration.ofMinutes(15)) // 15 minutes validity
.build();
PresignedGetObjectRequest presignedRequest = presigner.presignGetObject(presignRequest);
System.out.println("Presigned URL: " + presignedRequest.url());🔗 在浏览器中打开链接即可访问对象。
5.1.2 生成上传预签名 URL (PUT)
类似地,您也可以生成上传 URL
java
PutObjectRequest putRequest = PutObjectRequest.builder()
.bucket("my-bucket")
.key("upload.txt")
.build();
PresignedPutObjectRequest presignedPut = presigner.presignPutObject(
PutObjectPresignRequest.builder()
.putObjectRequest(putRequest)
.signatureDuration(Duration.ofMinutes(10))
.build()
);
System.out.println("Upload URL: " + presignedPut.url());5.2 实现分片上传
分片上传是大文件上传的推荐方式,可以在网络波动时实现断点续传。
5.2.1 开始分片上传
java
CreateMultipartUploadRequest createRequest = CreateMultipartUploadRequest.builder()
.bucket("my-bucket")
.key("bigfile.zip")
.build();
CreateMultipartUploadResponse createResponse = s3.createMultipartUpload(createRequest);
String uploadId = createResponse.uploadId();5.2.2 上传每个分片
java
List<CompletedPart> completedParts = new ArrayList<>();
for (int i = 1; i <= 3; i++) {
String partPath = "part" + i + ".bin"; // Assume each part is a local file
UploadPartRequest uploadPartRequest = UploadPartRequest.builder()
.bucket("my-bucket")
.key("bigfile.zip")
.uploadId(uploadId)
.partNumber(i)
.build();
UploadPartResponse uploadPartResponse = s3.uploadPart(uploadPartRequest, Paths.get(partPath));
completedParts.add(
CompletedPart.builder()
.partNumber(i)
.eTag(uploadPartResponse.eTag())
.build()
);
}5.2.3 完成分片上传
java
CompletedMultipartUpload completedUpload = CompletedMultipartUpload.builder()
.parts(completedParts)
.build();
CompleteMultipartUploadRequest completeRequest = CompleteMultipartUploadRequest.builder()
.bucket("my-bucket")
.key("bigfile.zip")
.uploadId(uploadId)
.multipartUpload(completedUpload)
.build();
s3.completeMultipartUpload(completeRequest);
System.out.println("Multipart upload completed.");5.2.4 异常时中止上传 (可选)
java
AbortMultipartUploadRequest abortRequest = AbortMultipartUploadRequest.builder()
.bucket("my-bucket")
.key("bigfile.zip")
.uploadId(uploadId)
.build();
s3.abortMultipartUpload(abortRequest);