springboot 使用 minio
yml 配置
yml 配置
# ====================== ↓↓↓↓↓↓ MinIO文件服务器 ↓↓↓↓↓↓ ======================
minio:url: http://114.67.110.190:9001accessKey: minioadminsecretKey: minioadminbucketName: zpf
maven:
<dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.3.4</version></dependency>
属性文件:
package com.example.minio;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;@Data
@Configuration
@ConfigurationProperties(prefix = "minio")
public class MinIoProperties {/*** minio地址+端口号*/private String url;/*** minio用户名*/private String accessKey;/*** minio密码*/private String secretKey;/*** 文件桶的名称*/private String bucketName;}
工具类:
package com.example.minio;import io.minio.MinioClient;
import io.minio.ObjectStat;
import io.minio.PutObjectOptions;
import io.minio.messages.Bucket;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.List;@Slf4j
@Component
public class MinIoUtil {@AutowiredMinIoProperties minIoProperties;private static MinioClient minioClient;/*** 初始化minio配置** @param :* @return: void* @date : 2020/8/16 20:56*/@PostConstructpublic void init() {try {minioClient = new MinioClient(minIoProperties.getUrl(), minIoProperties.getAccessKey(),minIoProperties.getSecretKey());createBucket(minIoProperties.getBucketName());} catch (Exception e) {e.printStackTrace();log.error("初始化minio配置异常: 【{}】", e.fillInStackTrace());}}/*** 判断 bucket是否存在** @param bucketName:* 桶名* @return: boolean* @date : 2020/8/16 20:53*/@SneakyThrows(Exception.class)public static boolean bucketExists(String bucketName) {return minioClient.bucketExists(bucketName);}/*** 创建 bucket** @param bucketName:* 桶名* @return: void* @date : 2020/8/16 20:53*/@SneakyThrows(Exception.class)public static void createBucket(String bucketName) {boolean isExist = minioClient.bucketExists(bucketName);if (!isExist) {minioClient.makeBucket(bucketName);}}/*** 获取全部bucket** @param :* @return: java.util.List<io.minio.messages.Bucket>* @date : 2020/8/16 23:28*/@SneakyThrows(Exception.class)public static List<Bucket> getAllBuckets() {return minioClient.listBuckets();}/*** 文件上传** @param bucketName:* 桶名* @param fileName:* 文件名* @param filePath:* 文件路径* @return: void* @date : 2020/8/16 20:53*/@SneakyThrows(Exception.class)public static void upload(String bucketName, String fileName, String filePath) {minioClient.putObject(bucketName, fileName, filePath, null);}/*** 文件上传** @param bucketName:* 桶名* @param fileName:* 文件名* @param stream:* 文件流* @return: java.lang.String : 文件url地址* @date : 2020/8/16 23:40*/@SneakyThrows(Exception.class)public static String upload(String bucketName, String fileName, InputStream stream) {minioClient.putObject(bucketName, fileName, stream, new PutObjectOptions(stream.available(), -1));return getFileUrl(bucketName, fileName);}/*** 文件上传** @param bucketName:* 桶名* @param file:* 文件* @return: java.lang.String : 文件url地址* @date : 2020/8/16 23:40*/@SneakyThrows(Exception.class)public static String upload(String bucketName, MultipartFile file) {final InputStream is = file.getInputStream();final String fileName = file.getOriginalFilename();minioClient.putObject(bucketName, fileName, is, new PutObjectOptions(is.available(), -1));is.close();return getFileUrl(bucketName, fileName);}/*** 删除文件** @param bucketName:* 桶名* @param fileName:* 文件名* @return: void* @date : 2020/8/16 20:53*/@SneakyThrows(Exception.class)public static void deleteFile(String bucketName, String fileName) {minioClient.removeObject(bucketName, fileName);}/*** 下载文件** @param bucketName:* 桶名* @param fileName:* 文件名* @param response:* @return: void* @date : 2020/8/17 0:34*/@SneakyThrows(Exception.class)public static void download(String bucketName, String fileName, HttpServletResponse response) {// 获取对象的元数据final ObjectStat stat = minioClient.statObject(bucketName, fileName);response.setContentType(stat.contentType());response.setCharacterEncoding("UTF-8");response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));InputStream is = minioClient.getObject(bucketName, fileName);IOUtils.copy(is, response.getOutputStream());is.close();}/*** 获取minio文件的下载地址** @param bucketName:* 桶名* @param fileName:* 文件名* @return: java.lang.String* @date : 2020/8/16 22:07*/@SneakyThrows(Exception.class)public static String getFileUrl(String bucketName, String fileName) {return minioClient.presignedGetObject(bucketName, fileName);}}
minio分布式存储真香,还不赶快了解下?
在开发中经常会用到的就是文件存储了,以前经常都是在服务器目录上映射一个目录用来存储文件,这个当然也没有问题,如果存储量不大的话。当然还有的会选择使用第三方存储比如七牛云、阿里云的oss云储存方案,自己搭建常用的可能会使用fastdfs或其他的,我接触minio后发现这个还是很不错,使用简单,支持多种语言SDK开发起来特别方便,多的就不说了,赶快上车了解下。
文档地址:minio相关文档
docker快速安装单机版:(默认你已经安装了docker环境,不清楚先了解docker安装使用再来吧!)
GNU/Linux 和 macOS
docker run -p 9000:9000 --name minio1 \-v /mnt/data:/data \-v /mnt/config:/root/.minio \minio/minio server /data指定密钥:
docker run -p 9000:9000 --name minio1 \-e "MINIO_ACCESS_KEY=AKIAIOSFODNN7EXAMPLE" \-e "MINIO_SECRET_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" \-v /mnt/data:/data \-v /mnt/config:/root/.minio \minio/minio server /data
Windows
docker run -p 9000:9000 --name minio1 \-v D:\data:/data \-v D:\minio\config:/root/.minio \minio/minio server /data指定密钥:
docker run -p 9000:9000 --name minio1 \-e "MINIO_ACCESS_KEY=AKIAIOSFODNN7EXAMPLE" \-e "MINIO_SECRET_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" \-v D:\data:/data \-v D:\minio\config:/root/.minio \minio/minio server /data
特别提醒:(-v 映射路径一定要是绝对路径,不然启动会报错)
启动成功后访问浏览器:http://localhost:{port} 进行访问,不指定key和secret默认都是minioadmin,访问后进入登陆页面,输入key和secret即可登陆,登陆成功页面如下:
接下来点击红色按钮创建一个存储桶,即可上传文件,比如创建一个test
ok至此已经搭建完成了,就是这么简单就搭建好了一个简单的云存储系统了。
总结: 通过简单操作,搭建了好了,minio默认提供了管理页面,使用起来方便不要开发都可以直接使用,所以还是觉得很不错的。