minio服务搭建

minio服务搭建

下载docker
snap install docker
安装minio
docker pull minio/minio
创建文件夹
mkdir home/minio-data
启动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"
输入服务器ip地址加端口9001进入minio控制界面,成功进入代表服务部署成功
springboot连接minio
在pom.xml文件中引入minio依赖
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>7.1.0</version>
</dependency>
在yml文件里加上minio配置信息
#文件服务器
minio:
url: http://{这里填服务器的ip地址}:9000 服务器ip
access-key: minio 账号
secret-key: minio123 密码
bucket-name: test 桶名称,minio服务器配置
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();
}
}
上传文件的接口和工具类,接口写在若依的 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());
}
}
添加通用工具类,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);
}
}
添加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);
}
}
}
posted @   爱豆技术部  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
TOP
点击右上角即可分享
微信分享提示