minio上传图片工具类

minio上传图片工具

config包下

MinioConfig

package com.alibaba.health.model.file.config;

import com.alibaba.health.model.file.service.MinioService;
import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConditionalOnClass(MinioService.class)
@EnableConfigurationProperties(MinioProperties.class)
public class MinioConfig {

    @Autowired
    private MinioProperties prop;

    @Bean
    public MinioClient buildMinioClient(){
        System.out.println(prop);
        return MinioClient
                .builder()
                .credentials(prop.getAccessKey(),prop.getSecretKey())
                .endpoint(prop.getEndpoint())
                .build();
    }
}

MinioProperties

package com.alibaba.health.model.file.config;


import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.io.Serializable;

@Data
@ConfigurationProperties(prefix = "minio")  // 文件上传 配置前缀file.oss
public class MinioProperties implements Serializable {

    private String accessKey;
    private String secretKey;
    private String bucket;
    private String endpoint;
    private String readPath;
}

service包

package com.alibaba.health.model.file.service;

import com.alibaba.health.model.file.config.MinioConfig;
import com.alibaba.health.model.file.config.MinioProperties;
import io.minio.GetObjectArgs;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import io.minio.RemoveObjectArgs;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Import;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

@Slf4j
@EnableConfigurationProperties(MinioProperties.class)
@Import(MinioConfig.class)
public class MinioService {

    private final static String separator = "/";
    @Autowired
    private MinioClient minioClient;
    @Autowired
    private MinioProperties prop;

    /**
     * 构建文件存储目录
     *
     * @param dirPath
     * @param filename yyyy/mm/dd/file.jpg
     * @return
     */
    public String buildFilePath(String dirPath, String filename) {
        StringBuilder stringBuilder = new StringBuilder(50);
        if (!StringUtils.isEmpty(dirPath)) {
            stringBuilder.append(dirPath);
        }
        String date = DateTime.now().toString("/yyyy/MM/dd/");
        stringBuilder.
                append(date).
                append(filename);
        return stringBuilder.toString();
    }

    /**
     * 上传图片文件
     *
     * @param dirPath     目录名 可以为空
     * @param filename    文件名
     * @param inputStream 文件流
     * @return 文件全路径
     */
    public String uploadImgFile(String dirPath, String filename, InputStream inputStream) {
        String filePath = buildFilePath(dirPath, filename);
        try {
            PutObjectArgs putObjectArgs = PutObjectArgs.builder()
                    .object(filePath)
                    .contentType("image/jpg")
                    .bucket(prop.getBucket()).stream(inputStream, inputStream.available(), -1)
                    .build();
            minioClient.putObject(putObjectArgs);
            StringBuilder urlPath = new StringBuilder(prop.getReadPath());
            urlPath.append("/" + prop.getBucket());
            urlPath.append(filePath);
            return urlPath.toString();
        } catch (Exception ex) {
            log.error("minio put file error.", ex);
            throw new RuntimeException("上传文件失败");
        }
    }

    /**
     * 上传html文件
     *
     * @param prefix      文件前缀
     * @param filename    文件名
     * @param inputStream 文件流
     * @return 文件全路径
     */
    public String uploadHtmlFile(String prefix, String filename, InputStream inputStream) {
        String filePath = buildFilePath(prefix, filename);
        try {
            PutObjectArgs putObjectArgs = PutObjectArgs.builder()
                    .object(filePath)
                    .contentType("text/html")
                    .bucket(prop.getBucket()).stream(inputStream, inputStream.available(), -1)
                    .build();
            minioClient.putObject(putObjectArgs);
            StringBuilder urlPath = new StringBuilder(prop.getReadPath());
            urlPath.append(separator + prop.getBucket());
            urlPath.append(separator);
            urlPath.append(filePath);
            return urlPath.toString();
        } catch (Exception ex) {
            log.error("minio put file error.", ex);
            ex.printStackTrace();
            throw new RuntimeException("上传文件失败");
        }
    }

    /**
     * 删除文件
     *
     * @param fileUrl 文件全路径
     */
    public void delete(String fileUrl) {
        String key = fileUrl.replace(prop.getEndpoint() + "/", "");
        int index = key.indexOf(separator);
        String bucket = StringUtils.substringBefore(key, separator);
        String filePath = StringUtils.substringAfter(key, separator);
        // 删除Objects
        RemoveObjectArgs removeObjectArgs = RemoveObjectArgs.builder().bucket(bucket).object(filePath).build();
        try {
            minioClient.removeObject(removeObjectArgs);
        } catch (Exception e) {
            log.error("minio remove file error.  pathUrl:{}", fileUrl);
            e.printStackTrace();
        }
    }


    /**
     * 下载文件
     *
     * @param pathUrl 文件全路径
     * @return 文件流
     */
    public byte[] downLoadFile(String pathUrl) {
        String key = pathUrl.replace(prop.getEndpoint() + "/", "");
        int index = key.indexOf(separator);
        String bucket = key.substring(0, index);
        String filePath = key.substring(index + 1);
        InputStream inputStream = null;
        try {
            inputStream = minioClient.getObject(GetObjectArgs.builder().bucket(prop.getBucket()).object(filePath).build());
        } catch (Exception e) {
            log.error("minio down file error.  pathUrl:{}", pathUrl);
            e.printStackTrace();
        }

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        byte[] buff = new byte[100];
        int rc = 0;
        while (true) {
            try {
                if (!((rc = inputStream.read(buff, 0, 100)) > 0)) {
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            byteArrayOutputStream.write(buff, 0, rc);
        }
        return byteArrayOutputStream.toByteArray();
    }
}

resources包

META-INF包

spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.alibaba.health.model.file.service.MinioService

pom.xml

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
        </dependency>
        <dependency>
            <groupId>io.minio</groupId>
            <artifactId>minio</artifactId>
            <version>7.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
        </dependency>

controller层

@PostMapping("/setmeal/upload")
    public R imgFile(@RequestParam(name = "imgFile")MultipartFile file){
        return R.success(setmealService.upload(file));
    }

service层


@Autowired
    private MinioService minioService;




@Override
    public String upload(MultipartFile file) {
        // 上传到minio
        String url = uploadToMinio(file);
        // 保存到数据库
        saveToDB(url);
        return url;
    }



    private String uploadToMinio(MultipartFile file) {
        // 上传之前重命名,防止同名覆盖
        String originalFilename = file.getOriginalFilename();
        String suffix = originalFilename.substring(originalFilename.indexOf(".") + 1);
        String filename = UUID.randomUUID().toString() + "." + suffix;
        // 上传到minio
        String url = "";
        try {
            url = minioService.uploadImgFile("", filename, file.getInputStream());
            //url = minioService.uploadHtmlFile("", filename, file.getInputStream());
        } catch (IOException e) {
            return MessageConstant.PIC_UPLOAD_FAIL;
        }
        return url;
    }
	//存入数据库
    private void saveToDB(String url) {
        //此处省略存储对象信息
        TSetmeal setmeal = new TSetmeal();
        setmeal.setImg(url);
        . 
        .
        .
    }
minio:
  accessKey: 账号
  secretKey: 密码
  bucket: 桶名
  read-path: http://ip路径:9000
  endpoint: http://ip路径:9000

在这里插入图片描述

单独的模块中或者公共的模块

注意:记得把minio中的桶设置公共的public类型

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值