Springboot 使用MinIO (附源码 demo)

编程入门 行业动态 更新时间:2024-10-10 00:29:23

Springboot 使用MinIO (附<a href=https://www.elefans.com/category/jswz/34/1770099.html style=源码 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)

本文发布于:2024-03-09 18:43:31,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1725771.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:源码   Springboot   MinIO   demo

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!