AWS SDK for Java (v2)
The AWS SDK for Java v2 is the modern, non-blocking Java SDK from AWS. It targets Filebase via endpointOverride and Region.of("auto").
Install
Maven
<dependencies>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3</artifactId>
<version>2.27.0</version>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3-transfer-manager</artifactId>
<version>2.27.0</version>
</dependency>
</dependencies>
Gradle (Kotlin DSL)
implementation("software.amazon.awssdk:s3:2.27.0")
implementation("software.amazon.awssdk:s3-transfer-manager:2.27.0")
Initialize the client
FilebaseClient.java
import java.net.URI;
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.S3Configuration;
public class FilebaseClient {
public static S3Client create() {
AwsBasicCredentials creds = AwsBasicCredentials.create(
System.getenv("FILEBASE_KEY"),
System.getenv("FILEBASE_SECRET")
);
return S3Client.builder()
.endpointOverride(URI.create("https://s3.filebase.io"))
.region(Region.of("auto"))
.credentialsProvider(StaticCredentialsProvider.create(creds))
.build();
}
}
List buckets
ListBucketsResponse response = s3.listBuckets();
response.buckets().forEach(b -> System.out.println(b.name()));
Create a bucket
s3.createBucket(b -> b.bucket("my-bucket"));
// Public
s3.createBucket(b -> b.bucket("my-public-bucket").acl(BucketCannedACL.PUBLIC_READ));
Upload an object
import software.amazon.awssdk.core.sync.RequestBody;
s3.putObject(
b -> b.bucket("my-bucket")
.key("photo.jpg")
.contentType("image/jpeg")
.cacheControl("public, max-age=31536000"),
RequestBody.fromFile(Paths.get("photo.jpg"))
);
For large files, use the transfer manager:
import software.amazon.awssdk.transfer.s3.S3TransferManager;
import software.amazon.awssdk.transfer.s3.model.UploadFileRequest;
S3TransferManager tm = S3TransferManager.builder().s3Client(s3.async()).build();
UploadFileRequest req = UploadFileRequest.builder()
.putObjectRequest(p -> p.bucket("my-bucket").key("video.mp4"))
.source(Paths.get("./video.mp4"))
.build();
tm.uploadFile(req).completionFuture().join();
The transfer manager handles multipart upload, parallelism, and resumability automatically.
List objects
ListObjectsV2Iterable pages = s3.listObjectsV2Paginator(
b -> b.bucket("my-bucket").prefix("photos/")
);
for (ListObjectsV2Response page : pages) {
for (S3Object obj : page.contents()) {
System.out.println(obj.key() + " " + obj.size());
}
}
Download an object
import software.amazon.awssdk.core.ResponseInputStream;
import software.amazon.awssdk.services.s3.model.GetObjectResponse;
try (ResponseInputStream<GetObjectResponse> in =
s3.getObject(b -> b.bucket("my-bucket").key("photo.jpg"));
OutputStream out = Files.newOutputStream(Paths.get("downloaded.jpg"))) {
in.transferTo(out);
}
Delete an object
s3.deleteObject(b -> b.bucket("my-bucket").key("photo.jpg"));
Pre-signed URLs
import software.amazon.awssdk.services.s3.presigner.S3Presigner;
import software.amazon.awssdk.services.s3.presigner.model.GetObjectPresignRequest;
S3Presigner presigner = S3Presigner.builder()
.endpointOverride(URI.create("https://s3.filebase.io"))
.region(Region.of("auto"))
.credentialsProvider(StaticCredentialsProvider.create(creds))
.build();
GetObjectPresignRequest req = GetObjectPresignRequest.builder()
.signatureDuration(Duration.ofHours(1))
.getObjectRequest(g -> g.bucket("my-bucket").key("private.pdf"))
.build();
URL url = presigner.presignGetObject(req).url();
System.out.println(url);
Error handling
import software.amazon.awssdk.services.s3.model.NoSuchKeyException;
import software.amazon.awssdk.services.s3.model.S3Exception;
try {
s3.headObject(b -> b.bucket("my-bucket").key("missing.jpg"));
} catch (NoSuchKeyException e) {
// handle missing key
} catch (S3Exception e) {
// some other S3 error
System.err.println(e.awsErrorDetails().errorCode() + ": " + e.awsErrorDetails().errorMessage());
}