适配器模式minio实现文件上传,以及自由切换阿里云
文章浏览阅读11次。Java中的适配器模式是一种结构型设计模式,它主要用于的问题。通过适配器模式,可以将一个类的接口转换成客户端所期望的另一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起协作。适配器模式特点及应用场景-CSDN博客。
·
一、为什么会选择适配器模式?
- 了解适配器的特点以及应用场景
- 适配器模式特点及应用场景-CSDN博客文章浏览阅读11次。Java中的适配器模式是一种结构型设计模式,它主要用于的问题。通过适配器模式,可以将一个类的接口转换成客户端所期望的另一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起协作。
https://blog.csdn.net/qq_46285265/article/details/135567779?spm=1001.2014.3001.5501
- 选择适配器的原因:
- 企业开发中,会遇到上传更换服务器,比如腾云替换为阿里云,因为他们的接口封装不一样,如果使用传统的模式,我们就非常被动,需要开发人员从新将用到腾讯云的接口替换成为阿里云,这样就造成不必要的工作量,而且切换的话你要升级一次系统。
- 当你使用适配器模式你就不用去了解前人写的屎山代码,只要你完成阿里云接口的调用,怎么调用,只要开发阿里云相关的代码即可。
二、案例
1、第一步:安装docker安装minio
//minio下载
docker pull minio/minio
//启动minio
docker run -p 9000:9000 -p 9000:9000\
2、第二步:搭建一个maven项目对接minio
3、导入minio依赖
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.2.2</version>
</dependency>
4、编写适配器
- 写一个接口管理适配器的所有方法,作为一个模板
public interface StorageAdapter {
/**
* 创建存储桶
* @param bucketName
*/
public void createBucket(String bucketName);
/**
* 上传文件
*
* @param inputStream
* @param bucketName
* @param objectName
*/
public void uploadFile(InputStream inputStream, String bucketName, String objectName);
/**
* 获取所有桶
*
* @return
* @throws Exception
*/
public List<String> getBucketList();
/**
* 获取当前桶内所有文件
*
* @param bucketName
* @return
* @throws Exception
*/
public List<FileInfo> getAllFiles(String bucketName);
/**
* 下载文件
*
* @param bucketName 桶
* @param objectName 文件
* @return
* @throws Exception
*/
public InputStream doDownload(String bucketName, String objectName);
/**
* 删除桶
*
* @param bucketName
* @throws Exception
*/
public void deleteBucket(String bucketName) throws Exception;
/**
* 删除文件
*
* @param bucketName 桶
* @param objectName 文件名
* @throws Exception
*/
public void deleteObject(String bucketName, String objectName);
}
- minio实现这个适配器接口、阿里云也是一样的
5、编译一个配置类StorageConfig
- 配置类可以在项目启动的时候加载,自动选择是minio 适配器,或者阿里云
-
public class StorageConfig { @Value("${storage.storageType}") private String storageType; @Bean @RefreshScope public StorageAdapter storageAdapter() { if (storageType.equals("minio")) { return new MinioStorageAdapter(); } else if (storageType.equals("aliyun")) { return new AlyStorageAdapter(); } else { throw new IllegalStateException("没有找到文件适配器"); } } }
6、minio的接口应用
- minio连接配置
-
@Configuration public class MinioConfig { /** * minio地址 */ @Value("${minio.url}") private String url; /** * minio账户 */ @Value("${minio.accessKey}") private String accessKey; /** * minio 密钥 */ @Value("${minio.secretKey}") private String secretKey; /** * 获取minio客户端 * @return */ @Bean public MinioClient getMinioClient(){ return MinioClient.builder().endpoint(url).credentials(accessKey, secretKey).build(); } }
- minio在applcation动态配置
-
- minio工具类封装
-
@Component public class MinioUtil { @Resource private MinioClient minioClient; /** * 创建bucket桶 * * @param bucketName */ public void createBucket(String bucketName) throws Exception { boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build()); if (!exists) { minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build()); } } /** * 上传文件 * * @param inputStream * @param bucketName * @param objectName */ public void uploadFile(InputStream inputStream, String bucketName, String objectName) throws Exception { minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(objectName) .stream(inputStream, -1, Integer.MAX_VALUE).build()); } /** * 获取所有桶 * * @return * @throws Exception */ public List<String> getBucketList() throws Exception { List<Bucket> buckets = minioClient.listBuckets(); return buckets.stream().map(Bucket::name).collect(Collectors.toList()); } /** * 获取当前桶内所有文件 * * @param bucketName * @return * @throws Exception */ public List<FileInfo> getAllFiles(String bucketName) throws Exception { Iterable<Result<Item>> results = minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).build()); List<FileInfo> fileInfos = new ArrayList<>(); for (Result<Item> result : results) { Item item = result.get(); FileInfo fileInfo = new FileInfo(); fileInfo.setFileName(item.objectName()); fileInfo.setDirectory(item.isDir()); fileInfo.setEtag(item.etag()); fileInfos.add(fileInfo); } return fileInfos; } /** * 下载文件 * * @param bucketName 桶 * @param objectName 文件 * @return * @throws Exception */ public InputStream doDownload(String bucketName, String objectName) throws Exception { return minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build()); } /** * 删除桶 * * @param bucketName * @throws Exception */ public void deleteBucket(String bucketName) throws Exception { minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build()); } /** * 删除文件 * @param bucketName 桶 * @param objectName 文件名 * @throws Exception */ public void deleteObject(String bucketName, String objectName) throws Exception { minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(objectName).build()); } }
7、测试
- 编写控制类
-
@RestController @RequestMapping("/file") public class FileController { @Resource private FileService fileService; @RequestMapping("/getAllBuckets") public String testGetAllBuckets() throws Exception { List<String> bucketList = fileService.getAllBuckets(); return bucketList.toString(); } }
- 编写service类
-
@Service public class FileService { @Resource private final StorageAdapter storageAdapter; public FileService(StorageAdapter storageAdapter) { this.storageAdapter = storageAdapter; } public List<String> getAllBuckets() { return storageAdapter.getBucketList(); } }
三、如果想要实现不重启服务切换上传服务
- 我们会用到nacos,远程操作,自由切换。
- 这里就不多说了,该文章主要说明minio如何使用
更多推荐
所有评论(0)