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 @ 2025-01-02 15:09  爱豆技术部  阅读(188)  评论(0)    收藏  举报
TOP