适配器模式minio实现文件上传,以及自由切换阿里云

一、为什么会选择适配器模式? 

  1. 企业开发中,会遇到上传更换服务器,比如腾云替换为阿里云,因为他们的接口封装不一样,如果使用传统的模式,我们就非常被动,需要开发人员从新将用到腾讯云的接口替换成为阿里云,这样就造成不必要的工作量,而且切换的话你要升级一次系统。
  2. 当你使用适配器模式你就不用去了解前人写的屎山代码,只要你完成阿里云接口的调用,怎么调用,只要开发阿里云相关的代码即可。

二、案例

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如何使用
  • 26
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你可以使用MinIO Java客户端来实现文件和下载。MinIO是一个基于对象存储的开源项目,可以提供高性能的文件存储和访问。 首先,你需要在你的Java项目中添加MinIO Java客户端的依赖。你可以在Maven或者Gradle配置文件中加入以下依赖: Maven: ```xml <dependencies> <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>8.1.0</version> </dependency> </dependencies> ``` Gradle: ```groovy dependencies { implementation 'io.minio:minio:8.1.0' } ``` 接下来,你需要连接到MinIO服务器并进行认证。你可以使用以下代码完成: ```java import io.minio.MinioClient; public class MinioExample { public static void main(String[] args) { try { // 创建MinIO客户端对象 MinioClient minioClient = new MinioClient("http://your-minio-server-url", "access-key", "secret-key"); // 检查存储桶是否存在,如果不存在则创建 boolean isExist = minioClient.bucketExists("your-bucket"); if (!isExist) { minioClient.makeBucket("your-bucket"); } // 上文件 minioClient.putObject("your-bucket", "your-object-name", "/path/to/your-file"); // 下载文件 minioClient.getObject("your-bucket", "your-object-name", "/path/to/save-file"); } catch (Exception e) { e.printStackTrace(); } } } ``` 在上面的代码中,你需要替换以下参数: - `your-minio-server-url`:MinIO服务器的URL地址。 - `access-key`:你的MinIO访问密钥。 - `secret-key`:你的MinIO密钥。 - `your-bucket`:存储桶的名称。 - `your-object-name`:对象的名称。 - `/path/to/your-file`:待上文件路径。 - `/path/to/save-file`:下载文件保存的路径。 通过上述代码,你可以使用MinIO Java客户端实现文件和下载。希望对你有帮助!如有任何问题,请随时提出。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值