java若依框架集成minio对象存储及搭建服务全过程
1、在pom.xml文件中引入minio依赖2、在yml文件里加上minio配置信息3、minio客户端配置类4、上传文件的接口和工具类,接口写在若依的 ruoyi-admin包controller.common.CommonContrller中。当前文件必要的注入5、添加通用工具类,ruo-common包utils.file中的FileUploadUtils添加如下方法6、添加minio工具类,
一、基本依赖和配置
1、在pom.xml文件中引入minio依赖
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>7.1.0</version>
</dependency>
2、在yml文件里加上minio配置信息
#文件服务器
minio:
url: http://{这里填服务器的ip地址}:9000 服务器ip
access-key: minio 账号
secret-key: minio123 密码
bucket-name: test 桶名称,minio服务器配置
3、minio客户端配置类
/**
* Minio客户端注入
*/
@Configuration
public class MinioConfig {
@Value("${minio.accessKey}")
private String accessKey;
@Value("${minio.secretKey}")
private String secretKey;
@Value("${minio.url}")
private String url;
@Bean
public MinioClient minioClient() {
return MinioClient.builder()
.credentials(accessKey, secretKey)
.endpoint(url)
.build();
}
}
4、上传文件的接口和工具类,接口写在若依的 ruoyi-admin包controller.common.CommonContrller中。
当前文件必要的注入
/** 获取yml配置类里的桶名称*/
@Value("${minio.bucket-name}")
private String bucketName;
@Value("${minio.url}")
private String minioUrl;
@PostMapping("/uploadMinio")
public AjaxResult uploadFileMinio(MultipartFile file) throws Exception
{
try
{
String fileName = FileUploadUtils.uploadMinio(file,this.bucketName);
AjaxResult ajax = AjaxResult.success();
String url = minioUrl + fileName;
ajax.put("url", url);
ajax.put("fileName", fileName);
ajax.put("newFileName", FileUtils.getName(fileName));
ajax.put("originalFilename", file.getOriginalFilename());
return ajax;
}
catch (Exception e)
{
return AjaxResult.error(e.getMessage());
}
}
5、添加通用工具类,ruo-common包utils.file中的FileUploadUtils添加如下方法
private static final String uploadMinio(String bucketName, MultipartFile file, String[] allowedExtension)
throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException,
InvalidExtensionException
{
int fileNamelength = file.getOriginalFilename().length();
if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH)
{
throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH);
}
assertAllowed(file, allowedExtension);
try {
String fileName = extractFilename(file);
//调用自定义MinioUtil类方法
return MinioUtil.uploadFile(bucketName, fileName, file);
} catch (Exception e){
e.printStackTrace();
}
return "";
}
public static final String uploadMinio(MultipartFile file,String Name) throws IOException
{
try
{
return uploadMinio(Name,file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);
}
catch (Exception e)
{
throw new IOException(e.getMessage(), e);
}
}
6、添加minio工具类,创建MinioUtil类
package com.ruoyi.common.utils.file;
/**
* @ClassName MinioUtil
* @Description minio
* @Author yunxiaoleng
* @Date 2024/7/12 8:54
* @Version 1.0
**/
import com.ruoyi.common.utils.spring.SpringUtils;
import io.minio.*;
import io.minio.http.Method;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
/** 初始化了连接方法,及桶权限获取*/
public class MinioUtil {
/**
* @param bucketName 桶名称
* @param fileName
* @throws IOException
*/
public static String uploadFile(String bucketName, String fileName, MultipartFile multipartFile) throws IOException
{
String url = "";
MinioClient minioClient = SpringUtils.getBean(MinioClient.class);
try (InputStream inputStream = multipartFile.getInputStream()) {
boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
if (!found)
{
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
/**
* bucket权限-读写
*/
String READ_WRITE = "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:GetBucketLocation\",\"s3:ListBucket\",\"s3:ListBucketMultipartUploads\"],\"Resource\":[\"arn:aws:s3:::" + bucketName + "\"]},{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:DeleteObject\",\"s3:GetObject\",\"s3:ListMultipartUploadParts\",\"s3:PutObject\",\"s3:AbortMultipartUpload\"],\"Resource\":[\"arn:aws:s3:::" + bucketName + "/*\"]}]}";
minioClient.setBucketPolicy(SetBucketPolicyArgs.builder().bucket(bucketName).config(READ_WRITE).build());
}
minioClient.putObject(PutObjectArgs.builder().bucket(bucketName)
.object(fileName)
.stream(inputStream, multipartFile.getSize(), -1)
.contentType(multipartFile.getContentType()).build()
);
//路径获取
url = "/" + bucketName+ "/" + fileName;
//常规访问路径获取
return url;
} catch (Exception e) {
throw new IOException(e.getMessage(), e);
}
}
}
二、minio服务搭建
这里用的阿里云服务器,用docker搭建。
1、docker拉取minio镜像
docker pull minio/minio
2、创建文件存储目录
mkdir home/minio-data
3、启动minio,设置登录服务的用户名密码及端口
// 创建minio
docker run \
--name minio \
-p 9000:9000 \
-p 9001:9001\
-d \
-e "MINIO_ROOT_USER=admin" \
-e "MINIO_ROOT_PASSWORD=minio123" \
-v /home/minio-data:/data \
-v /usr/local/minio-config:/root/.minio \
minio/minio server /data --console-address ":9001" --address ":9000"
4、输入服务器ip地址加端口9001进入minio控制界面,成功进入代表服务部署成功
三、minio管理页面设置
1、bucket创建
刚刚用docker启动时设置的用户名密码,我的是admin/minio123。成功进入后点击Buckets然后点击右上角create创建桶,输入桶的名称完成创建,我在此处创建了一个名为test的桶。
2、bucket权限设置
点击test右边的manage按钮设置,将Access Policy改为public
3、用户创建
点击菜单栏Users进入使用用户管理界面,创建用户设置用户名为minio1密码为minio123,权限配置为读写,点击保存。java配置信息中所配置的key就是此处的用户。
四、测试
使用apifox进行测试,上传文件
成功返回上传文件路径
查看minio后台发现文件已经成功保存
五、报错可能情况
如果有报错的情况,请检测权限是否分配正确,bucket需要public,用户需要读写权限。之后检查yml配置文件中minio配置url端口是9000不是后台的端口9001,两个key对应user的key。bucket的名称要对应不能写错。最后查看阿里云服务控制台安全组所使用的两个端口是否开启。
更多推荐
所有评论(0)