官网:
https://www.minio.org.cn/overview.shtml
什么是Minlo
MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。
MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或 MySQL。
开源, S3 兼容, 让企业存储更强大,比快更快
MinIO 是一款高性能、分布式的对象存储系统. 它是一款软件产品, 可以100%的运行在标准硬件。即X86等低成本机器也能够很好的运行MinIO。
MinIO与传统的存储和其他的对象存储不同的是
它一开始就针对性能要求更高的私有云标准进行软件架构设计。因为MinIO一开始就只为对象存储而设计。所以他采用了更易用的方式进行设计,它能实现对象存储所需要的全部功能,在性能上也更加强劲,它不会为了更多的业务功能而妥协,失去MinIO的易用性、高效性。 这样的结果所带来的好处是:它能够更简单的实现局有弹性伸缩能力的原生对象存储服务。
MinIO在传统对象存储用例(例如辅助存储,灾难恢复和归档)方面表现出色。同时,它在机器学习、大数据、私有云、混合云等方面的存储技术上也独树一帜。当然,也不排除数据分析、高性能应用负载、原生云的支持。
特征
- 擦除码
- Bitrot保护
- 加密
- WORM
- 身份认证和管理
- 连续复制
- 全局一致性
- 多云网关
一.快速入门
1.下载直接去官网
wget http://dl.minio.org.cn/server/minio/release/linux-amd64/minio
2.新建minio安装目录,执行如下命令
chmod +x minio //给予权限
export MINIO_ACCESS_KEY=minioadmin //创建账号
export MINIO_SECRET_KEY=minioadmin //创建密码
./minio server /home/minio/data //启动
3.后台启动
nohup ./minio server /home/minio/data > /home/minio/data/minio.log &
4.查看状态
ps -ef|grep minio
二、进行访问,并设置桶
1.访问
地址:http://ip:9000
这里遇到了一个大的bug,踩坑花了快一个小时的时间正常需要去服务器把9000的防火墙打开,然后就可以正常启动,但是他会跳到别的端口号上面了,刚开始我没想别的,以为是教程的版本过低,我又重新下载了别的版本的,找了对应的几个文档,但是就在最后一筹莫展的时候,突然想着既然你挑了端口,那我把你跳转的端口打开是不是就可以了,结果问题真的出现在这里.我真的服了,本来晚上十一点准备睡,十点开始弄,耽误到现在23:36,这个坑我帮大家踩了
输入账号密码后:
进行创建桶,名字自取,创建完成后服务器home/minio/data下也会创建这个文件目录
进行设置
必须将规则设置成readwrite ,才可进行读取文件,否则只存或者只能读。
三、springboot进行实现
1.引入依赖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <!-- minio 相关依赖 --> <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>3.0.10</version> </dependency> <!-- alibaba的fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.51</version> </dependency> <!-- thymeleaf模板引擎 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
|
2.在 application.yml 文件中加入 MinIO 服务器的相关信息
1 2 3 4 5
| # minio 文件存储配置信息 minio: endpoint: http: accesskey: minioadmin secretKey: minioadmin
|
3.创建实体类
这一步,我们将配置文件中 minio 的配置信息通过注解的方式注入到 MinioProp 这个实体中,方便后面我们使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component;
@Data @Component @ConfigurationProperties(prefix = "minio") public class MinioProp {
private String endpoint;
private String accesskey;
private String secretKey; }
|
4、创建核心配置类
通过注入 MinIO 服务器的相关配置信息,得到 MinioClient 对象,我们上传文件依赖此对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| import io.minio.MinioClient; import io.minio.errors.InvalidEndpointException; import io.minio.errors.InvalidPortException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;
@Configuration @EnableConfigurationProperties(MinioProp.class) public class MinioConfig { @Autowired private MinioProp minioProp;
@Bean public MinioClient minioClient() throws InvalidPortException, InvalidEndpointException { return new MinioClient(minioProp.getEndpoint(), minioProp.getAccesskey(), minioProp.getSecretKey()); } }
|
5、上传工具类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| import com.alibaba.fastjson.JSONObject; import com.zyxx.email.common.redis.RedisUtil; import com.zyxx.email.utils.DateUtils; import io.minio.MinioClient; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; @Slf4j @Component public class MinioUtils { @Autowired private MinioClient client; @Autowired private MinioProp minioProp;
@SneakyThrows public void createBucket(String bucketName) { if (!client.bucketExists(bucketName)) { client.makeBucket(bucketName); } }
public JSONObject uploadFile(MultipartFile file, String bucketName) throws Exception { JSONObject res = new JSONObject(); res.put("code", 0); if (null == file || 0 == file.getSize()) { res.put("msg", "上传文件不能为空"); return res; } try { createBucket(bucketName); String originalFilename = file.getOriginalFilename(); String fileName = bucketName + "_" + System.currentTimeMillis() + originalFilename.substring(originalFilename.lastIndexOf(".")); client.putObject(bucketName, fileName, file.getInputStream(), file.getContentType()); res.put("code", 1); res.put("msg", minioProp.getEndpoint() + "/" + bucketName + "/" + fileName); return res; } catch (Exception e) { log.error("上传文件失败:{}", e.getMessage()); } res.put("msg", "上传失败"); return res; } }
|
6.controller接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| import com.alibaba.fastjson.JSONObject; import com.zyxx.email.common.minio.MinioUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; @Controller public class MinioController { @Autowired private MinioUtils minioUtils;
@PostMapping("/upload") @ResponseBody public String upload(@RequestParam(name = "file", required = false) MultipartFile file, HttpServletRequest request) { JSONObject res = null; try { res = minioUtils.uploadFile(file, "product"); } catch (Exception e) { e.printStackTrace(); res.put("code", 0); res.put("msg", "上传失败"); } return res.toJSONString(); } }
|
测试
代码仓库(跟上面的代码有一些出入
https://github.com/linxun1209/springboot-minio.git