概念
OSS(Object Storage Service):
- OSS是阿里云提供的对象存储服务,主要用于存储大规模的非结构化数据,例如图片、视频、文档等。它采用了分布式存储架构,可以实现高可用性和高可靠性。
- OSS支持通过API接口、SDK等方式进行数据上传、下载和管理,同时提供了数据安全、数据备份等功能,适用于各种云计算场景和大数据应用。
MinIO:
- MinIO是一个高性能的开源对象存储服务,支持标准的S3 API,可以部署在本地服务器、私有云或公有云上。它的设计目标是提供高性能、可扩展的对象存储解决方案。
- MinIO以轻量化和高度可定制性著称,可以快速部署并与各种应用程序集成。它具有良好的性能表现,适合用于存储大规模的数据、处理高并发请求等场景。
S3 API:
- S3 API是指Amazon Simple Storage Service(Amazon S3)提供的应用程序编程接口(API),它允许开发者和系统管理员以编程方式管理Amazon S3上的数据。S3 API是一套RESTful接口,通过它,用户可以在Amazon S3上执行各种操作,如创建和删除存储桶(Buckets),上传、下载和删除对象(Objects),以及设置对象和存储桶的权限等。
- MinIO是基于S3 API实现的,它提供了与Amazon S3兼容的API,这意味着任何支持S3 API的客户端或应用程序理论上都可以无缝地与MinIO进行交互,而无需修改代码。
使用
OSS(参考 阿里云文档):
创建存储空间
存储空间是OSS的全局命名空间,相当于数据的容器,可以存储若干文件。以下代码用于创建存储空间。
代码运行成功后,将创建名为 examplebucket 的存储空间。
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
public class Demo {
public static void main(String[] args) throws Exception {
// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填写Bucket名称,例如examplebucket。Bucket名称在OSS范围内必须全局唯一。
String bucketName = "examplebucket";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
try {
// 创建存储空间。
ossClient.createBucket(bucketName);
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
上传文件
以下代码用于通过流式上传的方式将文件上传到OSS。
代码运行成功后,exampledir 目录下将上传 exampleobject.txt 文件。
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import java.io.ByteArrayInputStream;
public class Demo {
public static void main(String[] args) throws Exception {
// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填写Bucket名称,例如examplebucket。
String bucketName = "examplebucket";
// 填写Object完整路径,例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。
String objectName = "exampledir/exampleobject.txt";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
try {
String content = "Hello OSS";
ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content.getBytes()));
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
下载文件
以下代码用于通过流式下载方式从OSS下载文件。
代码运行成功后,编译工具中将显示下载的文件内容。
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyun.oss.model.OSSObject;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
public class Demo {
public static void main(String[] args) throws Exception {
// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填写Bucket名称,例如examplebucket。
String bucketName = "examplebucket";
// 填写Object完整路径,例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。
String objectName = "exampledir/exampleobject.txt";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
try {
// 调用ossClient.getObject返回一个OSSObject实例,该实例包含文件内容及文件元数据。
OSSObject ossObject = ossClient.getObject(bucketName, objectName);
// 调用ossObject.getObjectContent获取文件输入流,可读取此输入流获取其内容。
InputStream content = ossObject.getObjectContent();
if (content != null) {
BufferedReader reader = new BufferedReader(new InputStreamReader(content));
while (true) {
String line = reader.readLine();
if (line == null) {
break;
}
System.out.println("\n" + line);
}
// 数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
content.close();
}
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
列举文件
以下代码用于列举存储空间bucket下的文件。默认列举100个文件。
代码运行成功后,编译工具中将显示列举的文件详情,例如 exampledir/exampleobject.txt 。
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyun.oss.model.OSSObjectSummary;
import com.aliyun.oss.model.ObjectListing;
public class Demo {
public static void main(String[] args) throws Exception {
// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填写Bucket名称,例如examplebucket。
String bucketName = "examplebucket";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
try {
// ossClient.listObjects返回ObjectListing实例,包含此次listObject请求的返回结果。
ObjectListing objectListing = ossClient.listObjects(bucketName);
// objectListing.getObjectSummaries获取所有文件的描述信息。
for (OSSObjectSummary objectSummary : objectListing.getObjectSummaries()) {
System.out.println(" - " + objectSummary.getKey() + " " +
"(size = " + objectSummary.getSize() + ")");
}
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
删除文件
以下代码用于删除指定文件。
代码运行成功后,将删除 exampledir 目录下的 exampleobject.txt 文件。
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
public class Demo {
public static void main(String[] args) throws Exception {
// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填写Bucket名称,例如examplebucket。
String bucketName = "examplebucket";
// 填写Object完整路径,例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。
String objectName = "exampledir/exampleobject.txt";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
try {
// 删除文件。
ossClient.deleteObject(bucketName, objectName);
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
MinIO:
import io.minio.BucketExistsArgs;
import io.minio.DownloadObjectArgs;
import io.minio.MakeBucketArgs;
import io.minio.MinioClient;
import io.minio.RemoveObjectArgs;
import io.minio.UploadObjectArgs;
import io.minio.messages.Bucket;
public class MinioExample {
public static void main(String[] args) {
try {
// 初始化Minio客户端
MinioClient minioClient = MinioClient.builder()
.endpoint("http://minio.example.com") // MinIO服务器地址
.credentials("accessKey", "secretKey") // 访问密钥和密钥
.build();
// 创建存储空间(Bucket)
String bucketName = "example-bucket";
boolean bucketExists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
if (!bucketExists) {
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
System.out.println("Bucket created successfully: " + bucketName);
}
// 上传文件
String objectName = "example-file.txt";
String uploadFilePath = "/path/to/local/file.txt";
minioClient.uploadObject(UploadObjectArgs.builder()
.bucket(bucketName)
.object(objectName)
.filename(uploadFilePath)
.build());
System.out.println("File uploaded successfully: " + objectName);
// 下载文件
String downloadFilePath = "/path/to/local/downloaded-file.txt";
minioClient.downloadObject(DownloadObjectArgs.builder()
.bucket(bucketName)
.object(objectName)
.filename(downloadFilePath)
.build());
System.out.println("File downloaded successfully: " + objectName);
// 列举文件
Iterable<Bucket> buckets = minioClient.listBuckets();
for (Bucket bucket : buckets) {
System.out.println("Bucket Name: " + bucket.name());
}
// 删除文件
minioClient.removeObject(RemoveObjectArgs.builder()
.bucket(bucketName)
.object(objectName)
.build());
System.out.println("File deleted successfully: " + objectName);
} catch (Exception e) {
e.printStackTrace();
}
}
}
工具类封装
OSS
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.Bucket;
import com.aliyun.oss.model.GetObjectRequest;
import com.aliyun.oss.model.ListObjectsRequest;
import com.aliyun.oss.model.OSSObjectSummary;
import com.aliyun.oss.model.ObjectListing;
import java.io.File;
import java.util.List;
public class OssUtil {
private static OSS ossClient;
static {
try {
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com"; // OSS服务地址
String accessKeyId = "yourAccessKeyId"; // 访问密钥ID
String accessKeySecret = "yourAccessKeySecret"; // 访问密钥Secret
// 初始化OSS客户端
ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
} catch (Exception e) {
e.printStackTrace();
}
}
// 创建存储空间(Bucket)
public static void createBucket(String bucketName) {
try {
ossClient.createBucket(bucketName);
System.out.println("Bucket created successfully: " + bucketName);
} catch (Exception e) {
e.printStackTrace();
}
}
// 上传文件
public static void uploadFile(String bucketName, String objectName, String uploadFilePath) {
try {
ossClient.putObject(bucketName, objectName, new File(uploadFilePath));
System.out.println("File uploaded successfully: " + objectName);
} catch (Exception e) {
e.printStackTrace();
}
}
// 下载文件
public static void downloadFile(String bucketName, String objectName, String downloadFilePath) {
try {
ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File(downloadFilePath));
System.out.println("File downloaded successfully: " + objectName);
} catch (Exception e) {
e.printStackTrace();
}
}
// 列举存储桶
public static void listBuckets() {
try {
List<Bucket> buckets = ossClient.listBuckets();
for (Bucket bucket : buckets) {
System.out.println("Bucket Name: " + bucket.getName());
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 列举对象
public static void listObjects(String bucketName) {
try {
ObjectListing objectListing = ossClient.listObjects(new ListObjectsRequest(bucketName));
List<OSSObjectSummary> objectSummaries = objectListing.getObjectSummaries();
for (OSSObjectSummary objectSummary : objectSummaries) {
System.out.println("Object Key: " + objectSummary.getKey());
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 删除文件
public static void deleteFile(String bucketName, String objectName) {
try {
ossClient.deleteObject(bucketName, objectName);
System.out.println("File deleted successfully: " + objectName);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
createBucket("example-bucket");
uploadFile("example-bucket", "example-file.txt", "/path/to/local/upload-file.txt");
downloadFile("example-bucket", "example-file.txt", "/path/to/local/download-file.txt");
listBuckets();
listObjects("example-bucket");
deleteFile("example-bucket", "example-file.txt");
}
}
MinIO
import io.minio.BucketExistsArgs;
import io.minio.DownloadObjectArgs;
import io.minio.ListObjectsArgs;
import io.minio.MakeBucketArgs;
import io.minio.MinioClient;
import io.minio.RemoveObjectArgs;
import io.minio.Result;
import io.minio.UploadObjectArgs;
import io.minio.messages.Bucket;
import io.minio.messages.Item;
public class MinioUtil {
private static MinioClient minioClient;
static {
try {
String endpoint = "https://minio.example.com"; // MinIO服务器地址
String accessKey = "accessKey"; // 访问密钥
String secretKey = "secretKey"; // 密钥
// 初始化Minio客户端
minioClient = MinioClient.builder()
.endpoint(endpoint)
.credentials(accessKey, secretKey)
.build();
} catch (Exception e) {
e.printStackTrace();
}
}
// 创建存储空间(Bucket)
public static void createBucket(String bucketName) {
try {
if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) {
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
System.out.println("Bucket created successfully: " + bucketName);
} else {
System.out.println("Bucket already exists: " + bucketName);
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 上传文件
public static void uploadFile(String bucketName, String objectName, String uploadFilePath) {
try {
minioClient.uploadObject(UploadObjectArgs.builder()
.bucket(bucketName)
.object(objectName)
.filename(uploadFilePath)
.build());
System.out.println("File uploaded successfully: " + objectName);
} catch (Exception e) {
e.printStackTrace();
}
}
// 下载文件
public static void downloadFile(String bucketName, String objectName, String downloadFilePath) {
try {
minioClient.downloadObject(DownloadObjectArgs.builder()
.bucket(bucketName)
.object(objectName)
.filename(downloadFilePath)
.build());
System.out.println("File downloaded successfully: " + objectName);
} catch (Exception e) {
e.printStackTrace();
}
}
// 列举存储桶
public static void listBuckets() {
try {
Iterable<Bucket> buckets = minioClient.listBuckets();
for (Bucket bucket : buckets) {
System.out.println("Bucket Name: " + bucket.name());
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 列举对象
public static void listObjects(String bucketName) {
try {
Iterable<Result<Item>> listObjects = minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).build());
for (Result<Item> object : listObjects) {
System.out.println(object.get().objectName());
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 删除文件
public static void deleteFile(String bucketName, String objectName) {
try {
minioClient.removeObject(RemoveObjectArgs.builder()
.bucket(bucketName)
.object(objectName)
.build());
System.out.println("File deleted successfully: " + objectName);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
MinioUtil.createBucket("example-bucket");
MinioUtil.uploadFile("example-bucket", "example-file.txt", "/path/to/local/upload-file.txt");
MinioUtil.downloadFile("example-bucket", "example-file.txt", "/path/to/local/download-file.txt");
MinioUtil.listBuckets();
MinioUtil.listObjects("example-bucket");
MinioUtil.deleteFile("example-bucket", "example-file.txt");
}
}