文章目录
引入相关依赖
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,
- 依赖冲突问题请参考这篇博客:springboot项目启动报错
配置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;
}