springboot 集成minio

1. minio

官网:https://www.minio.org.cn/
windows启动方式:minio.exe server D:\worksoft\minio
访问:http://localhost:9000

2. 引入mvn包

 <dependency>
    <groupId>com.squareup.okhttp3</groupId>
     <artifactId>okhttp</artifactId>
     <version>4.10.0</version>
 </dependency>
 <dependency>
   <groupId>io.minio</groupId>
      <artifactId>minio</artifactId>
      <version>8.3.5</version>
  </dependency>

3.实现

properties

	# Minio配置
	# ip地址
	minio.endpoint=127.0.0.1
	#  端口号
	minio.port=9000
	#  账号
	minio.accessKey=minioadmin
	#  密码
	minio.secretKey=minioadmin
	#如果是true,则用的是https而不是http,默认值是true
	minio.secure=false
	# 桶的名字
	minio.bucketName=testfile
	#保存到本地的路径
	minio.configDir="D:/"

config 类

@Component
@ConfigurationProperties(prefix = "minio")
public class MinioConfig {
		//    # ip地址
		//    minio.endpoint=127.0.0.1
		    private String endpoint;
		//            #  端口号
		//    minio.port=9000
		    private String port;
		//            #  账号
		//    minio.accessKey=minioadmin
		    private String accessKey;
		//#  密码
		//    minio.secretKey=minioadmin
		    private String secretKey;
		//#如果是true,则用的是https而不是http,默认值是true
		//    minio.secure=false
		    private String secure;
		//            # 桶的名字
		//    minio.bucketName="huike-crm"
		    private String bucketName;
		//            #保存到本地的路径
		//    minio.configDir="/data/excel"
		    private String configDir;
    }

controller

 @ApiOperation("minio调用")
    @PostMapping("/uploadMinio")
    public AjaxResult uploadFileMinio(MultipartFile file) {
        return minioService.uploadFile(file);
    }

service

   @Autowired
    private MinioConfig minioConfig;

    @Override
    public AjaxResult uploadFile(MultipartFile file) {
        InputStream inputStream = null;
        //创建Minio的连接对象
        MinioClient minioClient = getClient();
        //桶对象
        String bucketName = minioConfig.getBucketName();
        try {
            inputStream = file.getInputStream();
            //基于官网的内容,判断文件存储的桶是否存在 如果桶不存在就创建桶
            boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
            if (exists) {
                System.out.println("该桶已经存在");
            } else {
                minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
            }
            /**
             * ================================操作文件================================
             * 思路:我们上传的文件是:文件.pdf
             * 那么我们应该上传到配置的bucket内 我们配置的bucketName是huike-crm
             * 那么我们存在桶里的文件应该是什么样的 也叫“文件.pdf”吗?
             * 应该按照上传的年月日进行区分
             * 举例:2021-05-05日进行上传的
             * 那么存在桶里的路径应该是
             * huike-crm/2021/05/05/这个目录下
             * 而对于同一个文件,存在重名问题,所以我们应该利用UUID生成一个新的文件名,并拼接上 .pdf 作为文件后缀
             * 那么完整的路径就是 huike-crm/2021/05/05/uuid.pdf
             *
             * 如果上述思路你无法理解,那么就直接存放在桶内生成uuid+.pdf即可
             * 即:huike-crm/uuid.pdf
             */
            //操作文件
            String fileName = file.getOriginalFilename();
            String objectName = new SimpleDateFormat("yyyy/MM/dd/").format(new Date()) + UUID.randomUUID().toString().replaceAll("-", "")
                    + fileName.substring(fileName.lastIndexOf("."));
            PutObjectArgs objectArgs = PutObjectArgs.builder().object(objectName)
                    .bucket(bucketName)
                    .contentType(file.getContentType())
                    .stream(file.getInputStream(), file.getSize(), -1).build();
            minioClient.putObject(objectArgs);
            //封装访问的url给前端
            AjaxResult ajax = AjaxResult.success();
            ajax.put("fileName", "/" + bucketName + "/" + objectName);
            //url需要进行截取
            ajax.put("url", minioConfig.getEndpoint() + ":" + minioConfig.getPort() + "/" + minioConfig.getBucketName() + "/" + fileName);
            /**
             * 构建返回结果集
             */

            /**
             * 封装需要的数据进行返回
             */
            return ajax;
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.error("上传失败");
        } finally {
            //防止内存泄漏
            if (inputStream != null) {
                try {
                    inputStream.close(); // 关闭流
                } catch (IOException e) {
//                    log.debug("inputStream close IOException:" + e.getMessage());
                }
            }
        }
    }

    /**
     * 免费提供一个获取Minio连接的方法
     * 获取Minio连接
     * @return
     */
    private MinioClient getClient() {
        MinioClient minioClient =
                MinioClient.builder()
                        .endpoint("http://" + minioConfig.getEndpoint() + ":" + minioConfig.getPort())
                        .credentials(minioConfig.getAccessKey(), minioConfig.getSecretKey())
                        .build();
        return minioClient;
    }

4.返回访问

{
    "data": {
        "msg": "操作成功",
        "fileName": "/testfile/2022/10/09/a808f9c6547f43ac8b5a1ce7318c12ba.png",
        "code": 200,
        "url": "127.0.0.1:9000/testfile/1.png"
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值