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;
	}
相关推荐
金灰2 分钟前
HTML5--裸体回顾
java·开发语言·前端·javascript·html·html5
菜鸟一皓2 分钟前
IDEA的lombok插件不生效了?!!
java·ide·intellij-idea
爱上语文5 分钟前
Java LeetCode每日一题
java·开发语言·leetcode
bug菌28 分钟前
Java GUI编程进阶:多线程与并发处理的实战指南
java·后端·java ee
程序猿小D41 分钟前
第二百六十九节 JPA教程 - JPA查询OrderBy两个属性示例
java·开发语言·数据库·windows·jpa
极客先躯2 小时前
高级java每日一道面试题-2024年10月3日-分布式篇-分布式系统中的容错策略都有哪些?
java·分布式·版本控制·共识算法·超时重试·心跳检测·容错策略
夜月行者2 小时前
如何使用ssm实现基于SSM的宠物服务平台的设计与实现+vue
java·后端·ssm
程序猿小D2 小时前
第二百六十七节 JPA教程 - JPA查询AND条件示例
java·开发语言·前端·数据库·windows·python·jpa
Yvemil72 小时前
RabbitMQ 入门到精通指南
开发语言·后端·ruby
sdg_advance2 小时前
Spring Cloud之OpenFeign的具体实践
后端·spring cloud·openfeign