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;
	}
相关推荐
一切皆有迹可循6 分钟前
IntelliJ IDEA中Spring Boot 3.4.x+集成Redis 7.x:最新配置与实战指南
spring boot·redis·intellij-idea
渴望脱下狼皮的羊35 分钟前
C++基础讲解
开发语言·c++·后端
是店小二呀43 分钟前
如何提升后端开发效率:从Spring Boot到微服务架构
spring boot·微服务·架构
倒霉蛋小马1 小时前
【Java集合】LinkedList源码深度分析
java·开发语言
风象南1 小时前
SpringBoot中6种API版本控制策略
java·spring boot·后端
小周不摆烂3 小时前
Java Web从入门到精通:全面探索与实战(一)
java
Source.Liu3 小时前
【学Rust写CAD】25 变量类(variable.rs)
后端·rust
cherryc_3 小时前
JavaSE基础——第六章 类与对象(二)
java·开发语言
快来卷java3 小时前
JVM虚拟机篇(三):JVM运行时数据区与方法区详解
java·jvm·mysql
whltaoin4 小时前
Java实现N皇后问题的双路径探索:递归回溯与迭代回溯算法详解
java·算法