对象存储-MinIo

简介:

构建高性能的云原生数据、机器学习,大数据分析,海量存储的基础架构、MinIO支持各种应用程序数据工作负载。

特点:

  • 高性能
  • 可扩展性
  • 云的原生支持
  • 简单
  • 开放全部源代码 + 企业级支持
  • 与Amazon S3 兼容

一、搭建

支持Docker镜像部署

1、从hub.docker.com拉取最新镜像

命令:docker pull minio/minio (此命令就等同于 : docker pull minio/minio:latest)

2、创建目录

一个用来存放配置,一个用来存储上传文件的目录

启动前需要先创建Minio外部挂载的配置文件( /home/minio/config),和存储上传文件的目录( /home/minio/data)

mkdir -p /home/minio/configmkdir -p /home/minio/data

3、创建Minio容器并运行

多行命令

docker run -p 9000:9000 -p 9090:9090–net=host–name minio-d –restart=always-e “MINIO_ACCESS_KEY=minioadmin”-e “MINIO_SECRET_KEY=minioadmin”-v /home/minio/data:/data-v /home/minio/config:/root/.miniominio/minio server/data –console-address “:9090” -address “:9000”

单行命令

docker run -p 9000:9000 -p 9090:9090–net=host–name minio-d –restart=always-e “MINIO_ACCESS_KEY=minioadmin”-e “MINIO_SECRET_KEY=minioadmin”-v /home/minio/data:/data-v /home/minio/config:/root/.miniominio/minio server/data –console-address “:9090” -address “:9000”

9090:客户端端口

9000:api端口(项目中所用)

MINIO_ACCESS_KEY :账号

MINIO_SECRET_KEY :密码(账号长度必须大于等于5,密码长度必须大于等于8位)

4、客户端访问

地址:http://ip:9090

二、整合项目(SpringBoot项目)

1、application.yml

2、minio文件上传工具类

public class MinioUtil {private static String minioUrl;private static String minioName;private static String minioPass;private static String bucketName;public static void setMinioUrl(String minioUrl) {MinioUtil.minioUrl = minioUrl;}public static void setMinioName(String minioName) {MinioUtil.minioName = minioName;}public static void setMinioPass(String minioPass) {MinioUtil.minioPass = minioPass;}public static void setBucketName(String bucketName) {MinioUtil.bucketName = bucketName;}public static String getMinioUrl() {return minioUrl;}public static String getBucketName() {return bucketName;}private static MinioClient minioClient = null;/** * 上传文件 * @param file * @return */public static String upload(MultipartFile file, String bizPath, String customBucket) {String file_url = “”;//update-begin-author:wangshuai date:20201012 for: 过滤上传文件夹名特殊字符,防止攻击bizPath=StrAttackFilter.filter(bizPath);//update-end-author:wangshuai date:20201012 for: 过滤上传文件夹名特殊字符,防止攻击String newBucket = bucketName;if(oConvertUtils.isNotEmpty(customBucket)){newBucket = customBucket;}try {initMinio(minioUrl, minioName,minioPass);// 检查存储桶是否已经存在if(minioClient.bucketExists(BucketExistsArgs.builder().bucket(newBucket).build())) {log.info(“Bucket already exists.”);} else {// 创建一个名为ota的存储桶minioClient.makeBucket(MakeBucketArgs.builder().bucket(newBucket).build());log.info(“create a new bucket.”);}InputStream stream = file.getInputStream();// 获取文件名String orgName = file.getOriginalFilename();if(“”.equals(orgName)){orgName=file.getName();}orgName = CommonUtils.getFileName(orgName);String objectName = bizPath+”/”+orgName.substring(0, orgName.lastIndexOf(“.”)) + “_” + System.currentTimeMillis() + orgName.substring(orgName.lastIndexOf(“.”));// 使用putObject上传一个本地文件到存储桶中。if(objectName.startsWith(“/”)){objectName = objectName.substring(1);}PutObjectArgs objectArgs = PutObjectArgs.builder().object(objectName).bucket(newBucket).contentType(“application/octet-stream”).stream(stream,stream.available(),-1).build();minioClient.putObject(objectArgs);stream.close();file_url = minioUrl+newBucket+”/”+objectName;}catch (Exception e){log.error(e.getMessage(), e);}return file_url;}/** * 文件上传 * @param file * @param bizPath * @return */public static String upload(MultipartFile file, String bizPath) {returnupload(file,bizPath,null);}/** * 获取文件流 * @param bucketName * @param objectName * @return */public static InputStream getMinioFile(String bucketName,String objectName){InputStream inputStream = null;try {initMinio(minioUrl, minioName, minioPass);GetObjectArgs objectArgs = GetObjectArgs.builder().object(objectName).bucket(bucketName).build();inputStream = minioClient.getObject(objectArgs);} catch (Exception e) {log.info(“文件获取失败” + e.getMessage());}return inputStream;}/** * 删除文件 * @param bucketName * @param objectName * @throws Exception */public static void removeObject(String bucketName, String objectName) {try {initMinio(minioUrl, minioName,minioPass);RemoveObjectArgs objectArgs = RemoveObjectArgs.builder().object(objectName).bucket(bucketName).build();minioClient.removeObject(objectArgs);}catch (Exception e){log.info(“文件删除失败” + e.getMessage());}}/** * 获取文件外链 * @param bucketName * @param objectName * @param expires * @return */public static String getObjectURL(String bucketName, String objectName, Integer expires) {initMinio(minioUrl, minioName,minioPass);try{GetPresignedObjectUrlArgs objectArgs = GetPresignedObjectUrlArgs.builder().object(objectName).bucket(bucketName).expiry(expires).build();String url = minioClient.getPresignedObjectUrl(objectArgs);return URLDecoder.decode(url,”UTF-8″);}catch (Exception e){log.info(“文件路径获取失败” + e.getMessage());}return null;}/** * 初始化客户端 * @param minioUrl * @param minioName * @param minioPass * @return */private static MinioClient initMinio(String minioUrl, String minioName,String minioPass) {if (minioClient == null) {try {minioClient = MinioClient.builder().endpoint(minioUrl).credentials(minioName, minioPass).build();} catch (Exception e) {e.printStackTrace();}}return minioClient;}/** * 上传文件到minio * @param stream * @param relativePath * @return */public static String upload(InputStream stream,String relativePath) throws Exception {initMinio(minioUrl, minioName,minioPass);if(minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) {log.info(“Bucket already exists.”);} else {// 创建一个名为ota的存储桶minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());log.info(“create a new bucket.”);}PutObjectArgs objectArgs = PutObjectArgs.builder().object(relativePath).bucket(bucketName).contentType(“application/octet-stream”).stream(stream,stream.available(),-1).build();minioClient.putObject(objectArgs);stream.close();return minioUrl+bucketName+”/”+relativePath;}}

3、controller

@PostMapping(value = “/uploadMinio”)public Result uploadMinio(HttpServletRequest request) {Result result = new Result();String bizPath = request.getParameter(“biz”);if(oConvertUtils.isEmpty(bizPath)){bizPath = “”;}MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;MultipartFile file = multipartRequest.getFile(“file”);// 获取上传文件对象String orgName = file.getOriginalFilename();// 获取文件名orgName = CommonUtils.getFileName(orgName);String file_url =MinioUtil.upload(file,bizPath);if(oConvertUtils.isEmpty(file_url)){return Result.error(“上传失败,请检查配置信息是否正确!”);}//保存文件信息OSSFile minioFile = new OSSFile();minioFile.setFileName(orgName);minioFile.setUrl(file_url);ossFileService.save(minioFile);result.setMessage(file_url);result.setSuccess(true);return result;}

4、前端组件

MINIO文件上传

好啦, 关于{对象存储-MinIo}分享就到这啦, 如果你是前端工程师同学,欢迎试用体验【webfunny监控系统】。

webfunny前端监控


Webfunny前端应用专注于微信小程序、H5前端、PC前端线上应用实时监控,实时监控前端网页、前端数据分析、错误统计分析监控和BUG预警,第一时间报警,快速修复BUG!支持私有化部署,容器化部署。

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
用户投稿
上一篇 2022年9月19日 18:28
下一篇 2022年9月19日 18:28

相关推荐

  • cad连续标注快捷键(cad连续标注快捷键)

    本文主要讲的是cad连续标注快捷键,以及和cad连续标注快捷键相关的知识,如果觉得本文对您有所帮助,不要忘了将本文分享给朋友。 cad中连续标注快捷键 CAD尺寸标准快捷命令:DL…

    2022年11月27日
  • 科比19岁女儿遭自称与她生“科比式孩子”男子跟踪骚扰

    极目新闻记者王亮亮黄佳琪 据福克斯新闻网报道,当地时间11月21日,已故篮球巨星科比·布莱恩特的长女娜塔莉亚·布莱恩特21日向法院提交临时限制令,声称这位32岁的前科从十几岁起就骚…

    2022年11月24日
  • 免费清理c盘的软件(清理c盘空间不影响系统)

    电脑用久了慢如龟速,还卡顿,这最大的原因啊就是C盘空间不足造成的。 即使电脑配置再好,或者硬盘再快,如果长时间没有打扫C盘,打开文件或者稳定之类的,都卡得让人头大。 这时候呢不要去…

    2022年11月24日
  • pdf虚拟打印机(添加pdf虚拟打印机)

    本文主要讲的是pdf虚拟打印机,以及和添加pdf虚拟打印机相关的知识,如果觉得本文对您有所帮助,不要忘了将本文分享给朋友。 pdf虚拟打印机具体是什么功能? 电脑虚拟打印机的功能有…

    2022年11月24日
  • ftp端口号(ftp端口号可以自定义吗)

    FTP端口号是21在FTP服务器中,我们往往会给不同的部门或者某个特定的用户设置一个帐户但是,这个账户有个特点,就是其只能够访问自己的主目录服务器通过这种方式来保障FTP服务上其他…

    2022年11月21日
  • 给手机安装了Windows 11(手机上玩电脑游戏的软件)

    电脑上体验了一番Windows 11 ,感觉怎么样?接下来想要在手机上尝试尝试吗?不是远程桌面,也并不是虚拟机,而是手机直接运行原生的win11系统! 那么最近小编就看到网上不少朋…

    2022年11月18日
  • 字体库在哪个文件夹(字体库在哪个文件夹里)

    今天小编给各位分享字体库在哪个文件夹的知识,其中也会对字体库在哪个文件夹里进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧! 字体库在Windows文件夹里面的…

    2022年11月17日
  • 命令方块怎么获得(我的世界凋零风暴命令方块怎么获得)

    本文主要讲的是命令方块怎么获得,以及和我的世界凋零风暴命令方块怎么获得相关的知识,如果觉得本文对您有所帮助,不要忘了将本文分享给朋友。 我的世界如何获得命令方块 我的世界可以输入/…

    2022年11月15日
  • dat是什么格式

    本文主要讲的是dat是什么格式,以及和相关的知识,如果觉得本文对您有所帮助,不要忘了将本文分享给朋友。 DAT是什么文件格式? dat格式 DAT格式: DAT(Digital A…

    2022年11月11日
  • 韩国踩踏事故6人被立案,有两人删除踩踏警告文件,他则视而不见

    韩国梨泰院踩踏事故已经过去多天,事故造成300多人死伤,其中155人遇难,失去亲人的人们估计还没有从悲伤中走出来,而韩国方面也很快做出了赔偿政策,决定对当时遇难的每人赔付1500万…

    2022年11月9日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息