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;
	}
相关推荐
码事漫谈18 小时前
【精华】C++成员初始化列表完全指南:为什么、何时以及如何正确使用
后端
码事漫谈19 小时前
C++ 强制类型转换:类型安全的多维工具
后端
开心香辣派小星19 小时前
23种设计模式-15解释器模式
java·设计模式·解释器模式
Halo_tjn20 小时前
虚拟机相关实验概述
java·开发语言·windows·计算机
RainbowSea20 小时前
github 仓库主页美化定制
后端
摆烂z20 小时前
Docker与Jib(maven插件版)实战
java
RainbowSea20 小时前
从 Spring Boot 2.x 到 3.5.x + JDK21:一次完整的生产环境迁移实战
java·spring boot·后端
笨手笨脚の20 小时前
Spring Core常见错误及解决方案
java·后端·spring
奶油松果20 小时前
Springboot自动装配 - redis和redission
java·spring boot·redis
计算机毕设匠心工作室20 小时前
【python大数据毕设实战】全球大学排名数据可视化分析系统、Hadoop、计算机毕业设计、包括数据爬取、数据分析、数据可视化、机器学习、实战教学
后端·python·mysql