minio搭建及使用 2021-03-22 18:56 > 提示:2021.7月最新版本的minio有部分更新,不再适用本篇文章。若想要依照文章内容搭建,请使用2021.7月份之前的版本。 # 简介 minio:非结构化数据对象存储服务,支持大量图片、短视频、音频等文件储存。 minio服务最少需要大概1G的磁盘空间。 > 以下为单点minio步骤,集群需要机器为4的倍数 # 安装配置与启动 登陆目标服务器 1、获取minio:wget https://dl.min.io/server/minio/release/linux-amd64/minio 2、赋予执行权限:chmod -x minio 3、移动到bin目录:mv minio /bin/ 4、导入账号密码:vim /etc/profile 在尾部新增 export MINIO_ACCESS_KEY=root(账号,至少3个字符) export MINIO_SECRET_KEY=12345678(密码,至少8个字符) 保存退出,执行source /etc/profile 5、创建minio储存目录,至少4个储存节点(节点数必须是4的倍数),可在单台创建四个目录,也可以在四台机器上分别创建:mkdir -p /data/minio1 /data/minio2 /data/minio3 /data/minio4 (创建的四个目录需要是全新的,不能是系统目录) 6、创建minio配置文件目录:mkdir /etc/minio 7、创建启动脚本:touch run.sh && chmod +x run.sh vim run.sh ```shell #!/bin/bash # description: minio service nohup minio server --config-dir /etc/minio /data/minio1 /data/minio2 /data/minio3 /data/minio4 > /var/log/minio.log 2>&1 & ``` **minio使用9000端口监听传入的连接,注意开启服务器9000端口** 创建停止脚本:touch stop.sh && chmod +x stop.sh vim stop.sh ```sh kill -9 $(ps -ef|grep minio|grep -v grep|awk '{print $2}') ``` 8、启动 > ./run.sh 检查:ps -ef | grep minio 浏览器输入http://${ip}:9000/ ,输入账号密码即可访问。 日志:tail -500f /var/log/minio.log  9、桶策略 随便选择一个桶,然后点击三个小点,选择Edit policy,然后编辑,第一个输入\*,第二个选择Read and Write,点击Add即可。  设置了这样的桶策略才能让你使用外链访问桶内的图片,直接在浏览器中预览图片内容:http://#{ip}:#{port}/#{bucket}/#{fileName} # 使用 bucket命名规则:小写字母、句点、连字符、数字是唯一允许的字符,长度至少应为3个字符。 例如: test √ sanfang_hx × sanfang-hx √ ## 在Java中使用 pom: ```xml <!--这里使用这个版本是因为发现高版本没有getObjectUrl的方法,我想使用这个方法就用了此版。其他版本使用之处略有不同--> <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>7.0.2</version> </dependency> <!--CollUtil.isEmpty工具类 非必要--> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.4.3</version> </dependency> ``` 示例: ```java package com.example.demo.MinioDemo; import io.minio.MinioClient; import io.minio.PutObjectOptions; import org.apache.commons.lang3.StringUtils; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.util.UUID; /** * @author: HanXu * on 2021/6/29 * Class description: minio基本使用 * 官方api: http://docs.minio.org.cn/docs/master/java-client-api-reference */ public class Demo { static String url = "your_minio_url"; static String username = "your_username"; static String password = "your_password"; public static void main(String[] args) { try { // 初始化一个minioke户端 MinioClient minioClient = new MinioClient(url, username, password); //----------------------------桶、对象 基本操作---------------------------- // 创建bucket 重复创建会报错 if (!minioClient.bucketExists("newbuck")) { minioClient.makeBucket("newbuck"); } // 列出所有bucket List<Bucket> buckets = minioClient.listBuckets(); System.out.println(Arrays.toString(buckets.toArray())); // 获取bucket内的所有对象 Iterable<Result<Item>> newbuck = minioClient.listObjects("newbuck"); boolean empty = CollUtil.isEmpty(newbuck); if (empty) { // 删除bucket 只有桶为空才能删除成功,否则报错 minioClient.removeBucket("newbuck"); } //----------------------------下载对象---------------------------- // 以流的形式下载一个对象 此方法的重载方法支持断点下载(下载对象指定区域的字节数组做为流) try (InputStream inputStream = minioClient.getObject("demo", "02.jpg"); FileOutputStream outputStream = new FileOutputStream("E:\\1my\\img\\xxyy.jpg")) { byte[] bytes = new byte[1024]; int len = 0; while ((len = inputStream.read(bytes)) != -1) { outputStream.write(bytes, 0, len); } System.out.println("end"); } catch (Exception e) { e.printStackTrace(); } // 下载并将文件保存到本地 minioClient.getObject("demo", "02.jpg", "E:\\1my\\img\\xxyy2.jpg"); //----------------------------上传对象---------------------------- // 通过InputStream上传对象 由于是流,不知道是啥文件,所以web界面不会显示出图片标志,将链接放在md文档中也不会加载图片 FileInputStream in = new FileInputStream("E:\\1my\\img\\wallpc.jpg"); minioClient.putObject("demo", "wallpc.jpg", in, new PutObjectOptions(in.available(), -1)); in.close(); // 通过文件路径上传对象 因为知道文件全路径,所以能确定是否是图片,如果是的话会在web界面上显示出图片标志 String filePath = "E:\\1my\\img\\Vast.jpg"; FileInputStream in2 = new FileInputStream(filePath); minioClient.putObject("demo", "Vast.jpg", filePath, new PutObjectOptions(in2.available(), -1)); in2.close(); //----------------------------操作对象---------------------------- //获取对象的基本数据 ObjectStat demo = minioClient.statObject("demo", "Vast.jpg"); System.out.println(demo); //ObjectStat{bucket='demo', name='Vast.jpg', contentType='image/jpeg', createdTime=2021-06-29T09:13:06Z, length=167959, etag='cd0e621a6278a5ee1cd1b0f56fa4b1db-1'} // 删除对象 如果某对象未上传完成,则需使用removeIncompleteUpload进行删除 minioClient.removeObject("demo", "Vast.jpg"); // 删除多个对象 LinkedList<String> list = new LinkedList<>(); list.add("03.jpg"); list.add("02.jpg"); minioClient.removeObjects("demo", list); //----------------------------获取对象url---------------------------- // 获取对象url 此bucket必须是设置了policy:*,Read and Write 的,否则获取到的链接不能打开 // 设置方法:https://blog.csdn.net/kylinregister/article/details/88910556 String url2 = minioClient.getObjectUrl("demo", "wallpc.jpg"); System.out.println(url2); //http://minio.riun.xyz/demo/wallpc.jpg // 获取对象url 没有设置policy的bucket,可以使用这个获取图片链接,url能直接打开 // 生成一个给HTTP GET请求用的presigned URL。浏览器/移动端的客户端可以用这个URL进行下载,即使其所在的存储桶是私有的。这个presigned URL可以设置一个失效时间,默认值是7天。 String url3 = minioClient.presignedGetObject("test", "5.jpg"); System.out.println(url3); // 默认七天 // 上传并获取文件链接 String filePath = "E:\\1my\\img\\11111.png"; String test = upload(minioClient, filePath); System.out.println(getUrl(minioClient, test)); //http://minio.riun.xyz/demo/d92200ee-4a3e-4007-a986-8bca5ef18161.png } catch(Exception e) { e.printStackTrace(); } } private static String upload(MinioClient minioClient, String filePath) throws Exception { String suffix = StringUtils.substringAfterLast(filePath, "."); String fileName = UUID.randomUUID().toString(); try (FileInputStream in = new FileInputStream(filePath);) { minioClient.putObject("demo", fileName + "." + suffix, filePath, new PutObjectOptions(in.available(), -1)); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); throw e; } return fileName + "." + suffix; } private static String getUrl(MinioClient minioClient, String fileName) { String url = null; try { url = minioClient.getObjectUrl("demo", fileName); } catch (Exception e) { e.printStackTrace(); } return url; } } ``` # 客户端工具 > 常规使用非必须 安装mc(minio client) 1、获取mc:wget https://dl.min.io/client/mc/release/linux-amd64/mc 2、chmod +x mc 3、mv mc /bin/ # 问题记录 > minio技术社区:http://slack.minio.org.cn/questions 1、问:Minio搭建后上传大文件(超过1M)就失败 答:跟minio无关,有可能是nginx做了限制。nginx默认最大上传文件为1M,只要不配置就都是1M。在配置文件的server_name节点同级添加配置重启即可。`client_max_body_size 10m;` # 参考 minio问题社区:http://slack.minio.org.cn/questions 文档: https://docs.min.io/docs/ (英文) https://docs.min.io/cn/ (中文) 在Java中使用: https://docs.min.io/cn/java-client-quickstart-guide.html https://github.com/minio/minio-java/tree/master/examples --END--
发表评论