MinIO实现简单文件上传【springboot】

文章目录


引入相关依赖

javascript 复制代码
  <dependency>
      <groupId>io.minio</groupId>
      <artifactId>minio</artifactId>
      <version>8.5.6</version>
  </dependency>

如果出现报错:

Description:

An attempt was made to call a method that does not exist. The attempt was made from the following location

io.minio.S3Base.(S3Base.java:105)

The following method did not exist:okhttp3.RequestBody.create([BLokhttp3/MediaType,)Lokhttp3/RequestBody,

配置application.yml文件

在application.yml种添加minio配置,注意yml文件的格式

javascript 复制代码
minio:
  config:
    url: http://127.0.0.1:9005 #ip地址
    accessKey: name #  账号
    secretKey: password #  密码
    secure: false #如果是true,则用的是https而不是http,默认值是true
    bucketName: "studyphoto-oss"  # 自己bucket桶的名字 相当于文件夹

编写minio的config文件

javascript 复制代码
//导包
import io.minio.MinioClient;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Data
@Configuration
@ConfigurationProperties(prefix = "minio.config")
public class MinioConfig {
    /**
     * 服务地址
     */
    private String url;

    /**
     * 用户名
     */
    private String accessKey;

    /**
     * 密码
     */
    private String secretKey;

    /**
     * 存储桶名称
     */
    private String bucketName;

    @Bean
    public MinioClient getMinioClient() {
        return MinioClient.builder().endpoint(url).credentials(accessKey, secretKey).build();
    }
}

编写minio的工具类

为了方便开发,将minio的操作封装为一个工具类

javascript 复制代码
//导包

import com.wedu.config.MinioConfig;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import io.minio.StatObjectArgs;
import io.minio.errors.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

/**
 *
 */
@Component
public class MinioUtils {
    /**
     * minio进行文件上传的注入工作
     * @param minioConfig
     * @param client :用于与MinIO服务进行交互,执行对象的存储操作(文件的上传、下载、删除等)
     */
    // 注入minio配置文件
    @Autowired
    private MinioConfig minioConfig;

    // 注入minio client
    @Autowired
    private MinioClient client;


    /**
     * 文件上传minio
     * @param originalFilename
     * @param file
     * @return
     */
    public String upload(String originalFilename, MultipartFile file) {
        String url="";
        // 获取文件的扩展名 例如.jpg .doc
        String extname = originalFilename.substring(originalFilename.lastIndexOf("."));
        // 构建文件上传相关信息
        PutObjectArgs args = null;
        try {
            args = PutObjectArgs.builder()// 构建上传文件信息
                    .bucket(minioConfig.getBucketName())//设置桶名
                    .object(originalFilename)//设置文件名
                    .stream(file.getInputStream(), file.getSize(), -1)//设置上传流
                    .contentType(file.getContentType())//设置文件类型
                    .build();
            // 将文件上传到minio服务器
            client.putObject(args);
        } catch (Exception e){
            e.printStackTrace();
        }

        // 组装文件信息,返回前端 或者存入数据路
        // 文件访问路径: http://127.0.0.1:9005/bucketName/objectName
        url = minioConfig.getUrl() + "/" + minioConfig.getBucketName() + "/" + originalFilename;

        return url;
    }

    /**
     * 判断文件是否存在
     * @param originalFilename
     * @return true存在
     */
    public Boolean checkFileIsExist(String originalFilename) {
        try {
            client.statObject(
                    StatObjectArgs.builder().bucket(minioConfig.getBucketName()).object(originalFilename).build()
            );
        } catch (Exception e) {
//            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * 获取文件访问路径
     * @param originalFilename
     * @return
     */
    public String getFileUrl(String originalFilename){
        return minioConfig.getUrl() + "/" + minioConfig.getBucketName() + "/" + originalFilename;
    }
}

其余操作(文件删除等 )可参考这篇博客:Minio工具类

图片文件上传测试

  • 控制层:SysUserController.java
javascript 复制代码
	@Autowired
    private SysUserService sysUserService;

/**
     *  上传头像
     * @param file
     * @return 返回图片的访问路径
     * @throws IOException
     */
    @PostMapping("upload")
    public R upload(@RequestParam("file") MultipartFile file) throws IOException {
        SysUserEntity user = getUser();//获取当前登录用户
        String url=sysUserService.uploadAvatar(file,user);
        return R.ok().put("url",url);
    }
  • Service层接口
javascript 复制代码
/**
	 * 上传头像
	 * @param file
	 * @param user
	 * @return 返回图片的访问路径
	 */
	String uploadAvatar(MultipartFile file, SysUserEntity user);
  • Service层实现类

注意一定要注入minio的工具类

javascript 复制代码
	@Autowired
	private MinioUtils minioUtils;//注入minio工具类

/**
	 * 上传头像
	 * @param file
	 * @param user
	 * @return 返回图片的访问路径
	 */
	@Override
	public String uploadAvatar(MultipartFile file, SysUserEntity user) {
		String url="";
		try {
			// 获取文件真实名称
			String originalFilename = file.getOriginalFilename();
			// 判断文件是否已经存在 不存在才进行上传和存储数据库操作
			if(!minioUtils.checkFileIsExist(originalFilename)){
				url = minioUtils.upload(originalFilename, file);
				user.setAvatar(url);// 更新用户头像url地址
				this.update(user);// 更新数据库中用户头像url地址
			}else {
				url=minioUtils.getFileUrl(originalFilename);
			}
		} catch (Exception e) {
//			throw new ServerException("文件上传异常" + e.getCause().toString());
//			try {
//				throw new ServerException("文件上传异常" + e.getCause().toString(),1,null);
//			} catch (ServerException ex) {
//				ex.printStackTrace();
//			}
		}
		return url;
	}
相关推荐
ps酷教程6 小时前
Jackson 解决没有无参构造函数的反序列化问题
java
NiceCloud喜云6 小时前
Opus 4.8 的 Effort Control 怎么选:Low 到 Max 五档策略
android·java·大数据·前端·c++·python·spring
为思念酝酿的痛6 小时前
POSIX信号量
linux·运维·服务器·后端
小羊在睡觉6 小时前
力扣84. 柱状图中最大的矩形
后端·算法·leetcode·golang·go
_日拱一卒7 小时前
LeetCode:994腐烂的橘子
java·数据结构·算法·leetcode·深度优先
swipe7 小时前
Neo4j + Graph RAG 医疗知识图谱工程实践:患者教育问答真正需要的是“关系可追溯”
后端·langchain·llm
隔窗听雨眠7 小时前
Nginx网关响应慢排查手记
java·服务器·nginx
智慧物业老杨7 小时前
智慧物业合同周期管理系统:从风险预警到智能交接的全流程数智化落地方案
java·人工智能·python
源码宝8 小时前
MES系统源码:Java8 + SpringBoot2.7 + MySQL8 + Redis,后端源码清爽易扩展
java·后端·源码·springboot·mes系统·源码二开·mes源码
JAVA社区8 小时前
Java高级全套教程(十)—— SpringCloudAlibaba超详细实战详解
java·开发语言·spring cloud·面试·职场和发展