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 分钟前
三层架构和MVC以及它们的融合
后端·mvc
亦世凡华、2 分钟前
【启程Golang之旅】从零开始构建可扩展的微服务架构
开发语言·经验分享·后端·golang
河西石头3 分钟前
一步一步从asp.net core mvc中访问asp.net core WebApi
后端·asp.net·mvc·.net core访问api·httpclient的使用
2401_8574396915 分钟前
SpringBoot框架在资产管理中的应用
java·spring boot·后端
怀旧66616 分钟前
spring boot 项目配置https服务
java·spring boot·后端·学习·个人开发·1024程序员节
李老头探索18 分钟前
Java面试之Java中实现多线程有几种方法
java·开发语言·面试
芒果披萨23 分钟前
Filter和Listener
java·filter
qq_49244844628 分钟前
Java实现App自动化(Appium Demo)
java
阿华的代码王国36 分钟前
【SpringMVC】——Cookie和Session机制
java·后端·spring·cookie·session·会话
德育处主任Pro1 小时前
『Django』APIView基于类的用法
后端·python·django