源码 demo)"/>
Springboot 使用MinIO (附源码 demo)
一、MinIO是什么
MinIO 是在 GNU Affero 通用公共许可证 v3.0 下发布的高性能对象存储。它与 Amazon S3 云存储服务 API 兼容。使用 MinIO 为机器学习、分析和应用程序数据工作负载构建高性能基础架构。
MInIO官网:MinIO | 高性能,对Kubernetes友好的对象
二、MinIO的下载与启动
从以下 URL 下载 MinIO 可执行文件:
1. 下载地址:/
2. 进入到minio.exe所在的目录,使用 .\minio.exe server D:\ 命令启动minio服务,
将D:\替换为希望 MinIO 存储数据的驱动器或目录的路径。
如下图所示,minio服务已启动:
MinIO 部署使用默认的 root 凭据开始RootUser和RootPass都为minioadmin。可以使用 MinIO 控制台测试部署,这是一个内置在 MinIO Server 中的嵌入式基于 Web 的对象浏览器。将主机上运行的 Web 浏览器指向http://127.0.0.1:9000并使用 root 凭据登录。您可以使用浏览器创建存储桶、上传对象和浏览 MinIO 服务器的内容。
3. 在浏览器输入:http://localhost:9000/ ,进入minIO登录界面。如下图所示:
4. 使用默认的RootUser和RootPass,都为minioadmin,进入MinIO控制台。如下图所示:
5. 创建bucket。点击Buckets---->Create Bucket
填写bucket名。(这个很重要,需要在java 中用到我这里叫test)
6.在java 中使用MinIO
1.添加依赖
<dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>${minio.version}</version></dependency>
2.在yml文件中加入配置信息 (因csdn审核的原因 大家自行 搜索MinIO 在yml 的配置)
3.配置config
package com.test.file.config;import io.minio.MinioClient;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** Minio 配置信息** @author ruoyi*/
@Configuration
@ConfigurationProperties(prefix = "minio")
public class MinioConfig
{/*** 服务地址*/private String url;/*** 用户名*/private String accessKey;/*** 密码*/private String secretKey;/*** 存储桶名称*/private String bucketName;public String getUrl(){return url;}public void setUrl(String url){this.url = url;}public String getAccessKey(){return accessKey;}public void setAccessKey(String accessKey){this.accessKey = accessKey;}public String getSecretKey(){return secretKey;}public void setSecretKey(String secretKey){this.secretKey = secretKey;}public String getBucketName(){return bucketName;}public void setBucketName(String bucketName){this.bucketName = bucketName;}@Beanpublic MinioClient getMinioClient(){return MinioClient.builder().endpoint(url).credentials(accessKey, secretKey).build();}
}
3.controller
package com.test.file.config;import io.minio.MinioClient;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** Minio 配置信息** @author ruoyi*/
@Configuration
@ConfigurationProperties(prefix = "minio")
public class MinioConfig
{/*** 服务地址*/private String url;/*** 用户名*/private String accessKey;/*** 密码*/private String secretKey;/*** 存储桶名称*/private String bucketName;public String getUrl(){return url;}public void setUrl(String url){this.url = url;}public String getAccessKey(){return accessKey;}public void setAccessKey(String accessKey){this.accessKey = accessKey;}public String getSecretKey(){return secretKey;}public void setSecretKey(String secretKey){this.secretKey = secretKey;}public String getBucketName(){return bucketName;}public void setBucketName(String bucketName){this.bucketName = bucketName;}@Beanpublic MinioClient getMinioClient(){return MinioClient.builder().endpoint(url).credentials(accessKey, secretKey).build();}
}
4.service和impL
public interface ISysFileService
{/*** 文件上传接口* * @param file 上传的文件* @return 访问地址* @throws Exception*/public String uploadFile(MultipartFile file) throws Exception;
}
package com.test.file.service.impl;import com.test.file.service.ISysFileService;
import com.test.file.utils.FileUploadUtils;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import com.test.file.config.MinioConfig;/*** @author wangc* @date 2023/3/6 8:48*/
@Service
public class MinioSysFileServiceImpl implements ISysFileService {@Autowiredprivate MinioConfig minioConfig;@Autowiredprivate MinioClient client;@Overridepublic String uploadFile(MultipartFile file) throws Exception {String fileName = FileUploadUtils.extractFilename(file);PutObjectArgs args = PutObjectArgs.builder().bucket(minioConfig.getBucketName()).object(fileName).stream(file.getInputStream(), file.getSize(), -1).contentType(file.getContentType()).build();client.putObject(args);return minioConfig.getUrl() + "/" + minioConfig.getBucketName() + "/" + fileName;}
}
5.utils工具类
package com.test.file.utils;import com.testmon.core.exception.file.FileNameLengthLimitExceededException;
import com.testmon.core.exception.file.FileSizeLimitExceededException;
import com.testmon.core.exception.file.InvalidExtensionException;
import com.testmon.core.utils.DateUtils;
import com.testmon.core.utils.StringUtils;
import com.testmon.core.utils.file.FileTypeUtils;
import com.testmon.core.utils.file.MimeTypeUtils;
import com.testmon.core.utils.uuid.Seq;
import com.testmon.core.utils.file.MimeTypeUtils;
import org.apachemons.io.FilenameUtils;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;
import java.nio.file.Paths;
import java.util.Objects;/*** 文件上传工具类* * @author ruoyi*/
public class FileUploadUtils
{/*** 默认大小 50M*/public static final long DEFAULT_MAX_SIZE = 50 * 1024 * 1024;/*** 默认的文件名最大长度 100*/public static final int DEFAULT_FILE_NAME_LENGTH = 100;/*** 根据文件路径上传** @param baseDir 相对应用的基目录* @param file 上传的文件* @return 文件名称* @throws IOException*/public static final String upload(String baseDir, MultipartFile file) throws IOException{try{return upload(baseDir, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);}catch (Exception e){throw new IOException(e.getMessage(), e);}}/*** 文件上传** @param baseDir 相对应用的基目录* @param file 上传的文件* @param allowedExtension 上传文件类型* @return 返回上传成功的文件名* @throws FileSizeLimitExceededException 如果超出最大大小* @throws FileNameLengthLimitExceededException 文件名太长* @throws IOException 比如读写文件出错时* @throws InvalidExtensionException 文件校验异常*/public static final String upload(String baseDir, MultipartFile file, String[] allowedExtension)throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException,InvalidExtensionException{int fileNamelength = Objects.requireNonNull(file.getOriginalFilename()).length();if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH){throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH);}assertAllowed(file, allowedExtension);String fileName = extractFilename(file);String absPath = getAbsoluteFile(baseDir, fileName).getAbsolutePath();file.transferTo(Paths.get(absPath));return getPathFileName(fileName);}/*** 编码文件名*/public static final String extractFilename(MultipartFile file){return StringUtils.format("{}/{}_{}.{}", DateUtils.datePath(),FilenameUtils.getBaseName(file.getOriginalFilename()), Seq.getId(Seq.uploadSeqType), FileTypeUtils.getExtension(file));}private static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException{File desc = new File(uploadDir + File.separator + fileName);if (!desc.exists()){if (!desc.getParentFile().exists()){desc.getParentFile().mkdirs();}}return desc.isAbsolute() ? desc : desc.getAbsoluteFile();}private static final String getPathFileName(String fileName) throws IOException{String pathFileName = "/" + fileName;return pathFileName;}/*** 文件大小校验** @param file 上传的文件* @throws FileSizeLimitExceededException 如果超出最大大小* @throws InvalidExtensionException 文件校验异常*/public static final void assertAllowed(MultipartFile file, String[] allowedExtension)throws FileSizeLimitExceededException, InvalidExtensionException{long size = file.getSize();if (size > DEFAULT_MAX_SIZE){throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024);}String fileName = file.getOriginalFilename();String extension = FileTypeUtils.getExtension(file);if (allowedExtension != null && !isAllowedExtension(extension, allowedExtension)){if (allowedExtension == MimeTypeUtils.IMAGE_EXTENSION){throw new InvalidExtensionException.InvalidImageExtensionException(allowedExtension, extension,fileName);}else if (allowedExtension == MimeTypeUtils.FLASH_EXTENSION){throw new InvalidExtensionException.InvalidFlashExtensionException(allowedExtension, extension,fileName);}else if (allowedExtension == MimeTypeUtils.MEDIA_EXTENSION){throw new InvalidExtensionException.InvalidMediaExtensionException(allowedExtension, extension,fileName);}else if (allowedExtension == MimeTypeUtils.VIDEO_EXTENSION){throw new InvalidExtensionException.InvalidVideoExtensionException(allowedExtension, extension,fileName);}else{throw new InvalidExtensionException(allowedExtension, extension, fileName);}}}/*** 判断MIME类型是否是允许的MIME类型** @param extension 上传文件类型* @param allowedExtension 允许上传文件类型* @return true/false*/public static final boolean isAllowedExtension(String extension, String[] allowedExtension){for (String str : allowedExtension){if (str.equalsIgnoreCase(extension)){return true;}}return false;}
}
6.domain
package com.test.file.domain;import org.apachemons.lang3.builder.ToStringBuilder;
import org.apachemons.lang3.builder.ToStringStyle;/*** @author wangc* @date 2023/3/6 8:47*/
public class SysFile {/*** 文件名称*/private String name;/*** 文件地址*/private String url;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}@Overridepublic String toString() {return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE).append("name", getName()).append("url", getUrl()).toString();}
}
7.如果还是不懂可以下载我的Demo
更多推荐
Springboot 使用MinIO (附源码 demo)
发布评论