# candy-s3
**Repository Path**: connormma/candy-s3
## Basic Information
- **Project Name**: candy-s3
- **Description**: Candy-S3 是一个统一的SDK,用于与多种云服务提供商的S3兼容对象存储服务进行交互。它提供了一套简洁易用的API,屏蔽了不同云服务商之间的差异,让开发者能够轻松地在多个云平台之间切换和管理对象存储资源。
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2025-12-05
- **Last Updated**: 2025-12-09
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Candy-S3
[](LICENSE)
[English Version](README.md) | [中文版本](README_zh.md)
Candy-S3 是一个统一的SDK,用于与多种云服务提供商的S3兼容对象存储服务进行交互。它提供了一套简洁易用的API,屏蔽了不同云服务商之间的差异,让开发者能够轻松地在多个云平台之间切换和管理对象存储资源。
## 功能特点
### 多云支持
- **Amazon S3**: 完整支持AWS S3的所有核心功能
- **Cloudflare R2**: 兼容Cloudflare R2服务
- **阿里云 OSS**: 兼容阿里云OSS服务
- **腾讯云 COS**: 支持腾讯云COS服务
- **自定义S3**: 支持任何兼容S3协议的对象存储服务
### 核心功能
- 存储桶管理(创建、删除、列举)
- 对象管理(上传、下载、删除、复制)
- 分片上传支持
- 预签名URL(用于上传和下载对象以及其他操作)
- 批量操作支持
以下高级特性在Candy-S3中也得到了支持,并对AWS S3进行了详尽的测试和验证,但在其他云服务商的S3服务中支持程度参差不齐:
- 对象版本控制
- 条件写入(如:If-Match, If-None-Match, If-Modified-Since, If-Unmodified-Since)
- 标签管理
- 对象锁定和合规保留
- 服务端加密
### 技术优势
- 统一API接口,无需针对不同云服务商编写不同代码
- 基于OkHttp的高性能HTTP客户端
- 完整的错误处理机制
- 支持绝大多数S3标准功能
- 易于集成和扩展
- 丰富的单元测试,覆盖核心功能和异常场景,确保代码质量和稳定性的同时可作为使用参考
## 快速开始
### 环境要求
- Java 8 或更高版本
- Maven 3.6+ (构建项目)
### 添加依赖
在你的 `pom.xml` 中添加以下依赖:
```xml
io.github.matian2014
candy-s3
1.0.0
```
> Candy-S3的代码足够简单,核心的功能只有一个类文件,你也可以直接将源代码集成到你的项目中,根据需要进行定制和扩展。
### 基本使用
我们提供了丰富的单元测试代码 `src/test/java/io/github/matian2014/candys3/CandyS3Test.java` ,帮助你快速了解和使用Candy-S3的各种功能。
#### 初始化客户端
```java
// 创建AWS S3客户端
CandyS3 client = new CandyS3(S3Provider.AWS);
client.setAccessKey("your-access-key");
client.setSecretKey("your-secret-key");
client.setRegion("us-east-1");
```
> 有部分云服务商的S3服务需要额外的参数,
> 如Cloudflare R2需要指定`account-id`,可以在初始化客户端时通过`setCloudflareR2AccountId`方法设置。
> 你可以参考单元测试代码 `src/test/java/io/github/matian2014/candys3/CandyS3Test.java` 中的示例,了解如何在不同云服务商的S3服务中使用Candy-S3。
#### 存储桶操作
```java
// 创建存储桶
CreateBucketOptions options = new CreateBucketOptions.CreateBucketOptionsBuilder("my-bucket").build();
client.createBucket(options);
// 列举存储桶
List buckets = client.listBucket(new ListBucketOptions()).getResults();
// 删除存储桶
client.deleteBucket("my-bucket");
```
#### 对象操作
```java
// 上传对象
String content = "Hello, World!";
PutObjectOptions putOptions = new PutObjectOptions.PutObjectOptionsBuilder()
.configureUploadData().withData(content.getBytes()).endConfigureDataContent()
.build();
String etag = client.putObject("my-bucket", "my-object", putOptions);
// 下载对象
DownloadObjectOptions downloadOptions = new DownloadObjectOptions.DownloadObjectOptionsBuilder()
.configureDataOutput().toBytes().endConfigureDataOutput()
.build();
S3Object object = client.getObject("my-bucket", "my-object", downloadOptions);
// 删除对象
client.deleteObject("my-bucket",new DeleteObjectOptions("my-object"));
```
## 支持的功能列表
| 功能 | AWS S3 |
|----------|--------|
| 存储桶创建/删除 | ✅ |
| 存储桶列举 | ✅ |
| 对象上传/下载 | ✅ |
| 分片上传 | ✅ |
| 版本控制 | ✅ |
| 对象锁定 | ✅ |
| 条件写入 | ✅ |
| 服务端加密 | ✅ |
| 预签名URL | ✅ |
| 标签管理 | ✅ |
| 访问策略 | ✅ |
我们将持续跟踪AWS S3的更新资讯并添加新功能。
对于其他云服务商,因为各自支持情况的差异,并不能保证所有操作均可用,你可以通过运行单元测试来确认(通常来说,核心的桶创建及删除、对象上传及下载功能是广泛支持的)。
## 构建项目
```bash
mvn clean install
```
## 运行测试
参考test/resources中的ini文件示例,为每个云服务商配置必要的访问凭证等参数,然后执行单元测试:
```bash
# 运行所有测试
mvn test
# 运行特定云服务商的测试
mvn test -Dtest=AwsS3Test
mvn test -Dtest=AliyunOSSTest
mvn test -Dtest=TencentcloudCosTest
mvn test -Dtest=CloudflareR2Test
mvn test -Dtest=CustomS3Test
```
## 贡献指南
欢迎提交Issue和Pull Request来改进这个项目。
1. Fork 本仓库
2. 创建功能分支 (`git checkout -b feature/AmazingFeature`)
3. 提交更改 (`git commit -m 'Add some AmazingFeature'`)
4. 推送到分支 (`git push origin feature/AmazingFeature`)
5. 开启 Pull Request
## 许可证
本项目采用 Apache License 2.0 许可证
## 联系方式
Connor Ma - com.tianma@gmail.com
项目链接: [https://github.com/matian2014/candy-s3](https://github.com/matian2014/candy-s3)