# demo4minio **Repository Path**: llh-gitee/demo4minio ## Basic Information - **Project Name**: demo4minio - **Description**: demo for minio - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2020-09-15 - **Last Updated**: 2022-02-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Minio的基本用法 MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。 MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。 ~~[官方文档](https://docs.min.io/cn)~~感觉没人更新了,示例都停留在3.x版本,sdk已经有7+,所以一些API已经过时需要自己摸索。他们开了个新的[官网](http://docs.minio.org.cn/docs/),这个网站倒是没有用古老版本。 依赖包 ```xml io.minio minio 7.0.2 ``` ## 基本概念 **存储桶**可以简单理解为“根文件夹”,每个存储桶都是minio服务下的一个一级结点,其下可以有多个子文件夹。 **对象**在minio服务里每个存储内容都是一个对象。 ## 启动minio服务 1. 下载`minio.exe`文件 2. 启动服务的命令`.\minio.exe server E:\temp` ,后面跟着的路径表示文件上传后存储的位置。 ![wyONRK.png](https://s1.ax1x.com/2020/09/15/wyONRK.png) 启动完成后,会显示本地访问地址和用户名密码(上图中标红的部分)。 minio内建了一个简单的web服务,可以通过用户名和密码登录网页进行管理。 ## 连接 使用kotlin代码连接minio服务: ```kotlin private lateinit var mc: MinioClient @BeforeEach fun init() { val endpoint = "http://127.0.0.1:9000" val accessKeyID = "minioadmin" val secretAccessKey = "minioadmin" val useSSL = false mc = MinioClient(endpoint, accessKeyID, secretAccessKey, useSSL) } ``` ## 创建存储桶 ```kotlin @Test fun testCreateBucket() { val bucketName = "test-bucket" val has = mc.bucketExists(bucketName) if (has) { println("$bucketName 已经存在!") } else { mc.makeBucket(bucketName) println("$bucketName 不存在,已创建!") } } ``` ## 配置访问策略 此步是可选的,只有对存储桶访问策略有特别要求时,才配置。 默认是只允许“登录”后才能访问存储桶。 ```kotlin /** * minio 使用的是aws权限-资源模型,规则很复杂, * 参考https://docs.aws.amazon.com/AmazonS3/latest/dev/access-policy-language-overview.html * 此方法将生成的权限是:可以匿名访问指定存储桶内的所有内容。 * 使用JSON字符串设定的访问策略在web管理端似乎看到不效果 */ @Test fun testAddPolicy() { val bucketName = "test-bucket" val p = """ { "Statement": [ { "Action": [ "s3:GetBucketLocation", "s3:ListBucket" ], "Effect": "Allow", "Principal": "*", "Resource": "arn:aws:s3:::$bucketName" }, { "Action": "s3:GetObject", "Effect": "Allow", "Principal": "*", "Resource": "arn:aws:s3:::$bucketName/*" } ], "Version": "2012-10-17" } """.trimIndent() // Version 是不能随便改的。 println(p) mc.setBucketPolicy(bucketName, p) val policy = mc.getBucketPolicy(bucketName) println(policy) } ``` ## 上传文件 ```kotlin /** * 测试上传文件 * 重复上传会覆盖同名文件。 */ @Test fun testUploadFile() { val bucketName = "test-bucket" val domeFile = domeFile() val fis = FileInputStream(domeFile) val options = PutObjectOptions( domeFile.length(), // or -1 , auto handle file size PutObjectOptions.MIN_MULTIPART_SIZE.toLong()) mc.putObject(bucketName, "demo.txt", fis, options) } private fun domeFile(filename: String = "demo.txt", context: String = "hello minio"): File { val path = Paths.get(ClassPathResource(filename).path) return if (path.toFile().exists()) { path.toFile() } else { Files.createFile(path) path.toFile().writeText(context) path.toFile() } } ``` ## 下载文件 ```kotlin @Test fun testGetFile() { val bucketName = "test-bucket" val fis = mc.getObject(bucketName, "demo.txt") val fos = Paths.get(ClassPathResource("down.txt").path) Files.copy(fis, fos, StandardCopyOption.REPLACE_EXISTING) } ``` # 使用nginx代理minio服务 minio不像fastdfs内置了http组件(好像fastdfs新版本去掉了)可以直接对外提供服务,需要配合ngin之类的web服务器才能实现“静态文件”服务器的功能。 **只有配置成minio的“公开桶”内的资源才能被代理供外部访问。** ## nginx配置 ``` server{ listen 81; server_name localhost; location / { proxy_buffering off; proxy_set_header Host $http_host; proxy_pass http://localhost:9000; } } ``` 如上配置就可以访问minio公开桶内的资源。 ## 编辑桶权限 [![wyxB1P.png](https://s1.ax1x.com/2020/09/15/wyxB1P.png)](https://imgchr.com/i/wyxB1P) [![wyxD6f.png](https://s1.ax1x.com/2020/09/15/wyxD6f.png)](https://imgchr.com/i/wyxD6f) 前缀`*`表示当前存储桶下所有资源都可以被公开访问。 经过上述配置后,即可使用浏览器访问minio内部的文件了。 如下:`http://localhost:81/test-bucket/a/7b31da84-2c20-4993-9552-be9a7db4e6c7.jpg` 这便是访问minio的`test-bucket` 存储桶下`a`文件夹内的图片了。 当然,你也可以用代码来创建一个“公开桶”。 # 小案例:模拟用户上传头像 用户选择图片上传,在另一侧回显用户上传的图片。 大致效果如下: [![wcIX1e.md.png](https://s1.ax1x.com/2020/09/16/wcIX1e.md.png)](https://imgchr.com/i/wcIX1e) 代码比较简单,就不展开细说了。