minio介绍
基础信息
- 官网:https://min.io/
- 中文官网:https://www.minio.org.cn/
- 开源地址:https://github.com/minio/minio
- MinIO 提供高性能、与S3 兼容的对象存储系统,让你自己能够构建自己的云储存服务。
- MinIO原生支持 Kubernetes,它可用于每个独立的公共云、每个 Kubernetes 发行版、私有云和边缘的对象存储套件。
- MinIO是软件定义的,不需要购买其他任何硬件,在 GNU AGPL v3 下是 100% 开源的。
docker安装
镜像拉取
- 拉取minio镜像
docker pull minio/minio
安装
- 执行docker命令安装
docker run -p 9000:9000 -p 9090:9090 \
--net=host \
--name rundreams-minio \
-d --restart=always \
-e "MINIO_ACCESS_KEY=admin" \
-e "MINIO_SECRET_KEY=admin123" \
-v /data/volume/minio/data:/data \
-v /data/volume/minio/config:/root/.minio \
minio/minio server \
/data --console-address ":9090" -address ":9000"
- /data/volume/minio/data 该路径会存上传的文件,建议挂载到比较大的磁盘
配置访问
- 访问端口 http://10.12.3.131:9090/
- 首页
创建Buckets
- 输入桶名字进行创建
- 进行桶配置
- 配置为公共桶
上传演示
- 进入文件列表
- 进行文件上传
- 成功访问该图片
密钥创建
创建用户
- 点击创建用户
- Access Key 、Secret Key 通过某密码网站随机生成,后面会用到
-随机密码生成: http://www.jsons.cn/randompwd/
项目使用
搭建文件服务器
- 搭建Demo GitHub:https://github.com/rundreamstop/minio-file
- gitcode同步地址:https://gitcode.net/rundreamstop/minio-file
- 下载代码只需修改 application-dev.yml
- 直接运行SpringBoot启动类:RunMinioFileApplication
核心代码预览
- 上传文件控制器
/**
* 文件上传请求
*/
@PostMapping("upload")
public R<File> upload(MultipartFile file) {
try {
// 上传并返回访问地址
String url = fileService.uploadFile(file);
File file1 = new File();
file1.setName(FileUtils.getName(url));
file1.setUrl(url);
return R.ok(file1);
} catch (Exception e) {
log.error("上传文件失败", e);
return R.fail(e.getMessage());
}
}
- 上传文件service
/**
* 本地文件上传接口
*
* @param file 上传的文件
* @return 访问地址
* @throws Exception
*/
public String uploadFile(MultipartFile file) throws Exception {
String fileName = FileUtils.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;
}
上传文件
- 使用postman 或者 ApiPost等模拟调用接口工具
- 可以看到文件的名字和访问地址是通过重命名的,具体可以看代码
/**
* 编码文件名
*/
public static final String extractFilename(MultipartFile file) {
return StrUtil.format("{}{}.{}", DateUtil.formatDate(DateUtil.date()).replace("-", ""), RandomUtil.randomString(20), FileTypeUtils.getExtension(file));
}
- 直接访问图片地址
- 查看我们的桶目录下也多了一个文件
删除文件
- 调用删除接口
- 删除核心代码
/**
* 删除文件
*
* @param fileName
* @return
* @throws Exception
*/
public R deleteFile(String fileName) throws Exception {
RemoveObjectArgs args = RemoveObjectArgs.builder().
bucket(minioConfig.getBucketName()).
object(fileName).
build();
client.removeObject(args);
return R.ok();
}
- 桶中文件已经被删除
实际业务
在实际业务中,前端直接调用文件服务器进行文件上传、文件删除等api,通过内网restapi调用,切记不用开外网,增加安全风险,然后上传后获取地址进行实际业务存库。
总结
- 因为演示环境只做了单机部署,没有进行高可用部署操作,生产环境必须使用分布式部署
- 如果单机部署,minio某些特性演示不能使用的,比如
- 博客中只演示了文件服务器比较基础的文件上传及文件删除功能演示,如果确定要使用minio做为文件服务器,还是建议更深入了解一些。
学 Java,找 rundreamsFly
Java开发工程师如何高质量提示自己 | https://bbs.csdn.net/topics/614436959 |
2023年了,Java还能学么? | https://bbs.csdn.net/topics/614415550 |
为什么有人愿意花几万块就参加IT培训 | https://bbs.csdn.net/topics/613885348 |
2023 年,想转行互联网行业还能吃香了吗? | https://bbs.csdn.net/topics/613850238 |
Java网上私教战老师靠谱吗? | https://bbs.csdn.net/topics/613525044 |