码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 分布式文件系统--MinIO


    1 MinIO安装(Docker)

            ●在root目录下新建docker_minio文件夹

            ●在docker_minio文件夹下新建config文件夹,data文件夹

            ●在root目录下新建docker_compose文件夹,在docker_compose文件夹中添加docker-compose.yaml

    1. services:
    2. minio:
    3. image: quay.io/minio/minio
    4. container_name: minio_container
    5. ports:
    6. - "9000:9000" #api接口(内部访问)
    7. - "9001:9001" #控制台端口(外部界面)
    8. environment:
    9. TZ: Asia/Shanghai #时区上海
    10. MINIO_ROOT_USER: abc #管理后台用户名
    11. MINIO_ROOT_PASSWORD: abc #管理后台密码(最少8个字符)
    12. MINIO_COMPRESS: "off" #开启压缩(on开启,off关闭)
    13. MINIO_COMPRESS_EXTENSIONS: "" #扩展名 .pdf .doc为空,所有类型均压缩
    14. MINIO_COMPRESS_MIME_TYPES: "" #mine类型application/pdf为空,所有类型均压缩
    15. volumes:
    16. - "/root/docker_minio/data:/data" #映射当前目录下的打他目录至容器内/data目录
    17. - "/root/docker_minio/config:/root/.minio" #映射配置目录
    18. command: server --address ':9000' --console-address ':9001' /data #服务器地址是9000,服务器控制台地址是9001,数据储存在/data下
    19. privileged: true
    20. networks:
    21. - sunner_network

            ●通过docker compose up -d命令执行docker-compose.yaml文件(必须在docker_compose文件夹目录下执行),然后系统会自动拉取minio镜像,创建并启动minio容器

    ​​​​​​​        ●执行docker ps -a命令,出现下图,表示安装和启动minio成功

    2 MinIO的使用

            访问MinIO有2个端口,分别是9000端口和9001端口

                    9000端口是用于内部访问,比如用户通过SpringBoot接口间接访问MinIO

                    9001端口是用于外部访问,即通过浏览器访问

    2.1 桶

            MinIO所有的文件都保存在桶中,可以将桶理解为文件夹

    2.1.1新建桶

    2.1.2 上传文件

    2.2 网页访问图片

    2.2.1 复制访问链接

            ●将127.0.0.1修改为MinIO所在服务器地址

            ●去掉访问链接后半段(去掉.png之后的)

    2.2.2 修改桶权限为public

    2.2.3 访问图片

            在浏览器的地址栏输入"访问链接"

    3 SpringBoot集成MinIO

    3.1 引入依赖

    1. <dependency>
    2. <groupId>io.miniogroupId>
    3. <artifactId>minioartifactId>
    4. <version>8.5.9version>
    5. dependency>

    3.2 application.yaml

    1. minio:
    2. endpoint: http://123.123.123.123:9000 #minio所在服务器访问地址
    3. accessKey: abc #用户名
    4. secretKey: abc #密码

    3.3 MinIO配置类

    1. @Component
    2. @ConfigurationProperties(prefix = "minio")
    3. public class MinioProp {
    4. private String endpoint;
    5. private String accessKey;
    6. private String secretKey;
    7. public String getEndpoint() {
    8. return endpoint;
    9. }
    10. public void setEndpoint(String endpoint) {
    11. this.endpoint = endpoint;
    12. }
    13. public String getAccessKey() {
    14. return accessKey;
    15. }
    16. public void setAccessKey(String accessKey) {
    17. this.accessKey = accessKey;
    18. }
    19. public String getSecretKey() {
    20. return secretKey;
    21. }
    22. public void setSecretKey(String secretKey) {
    23. this.secretKey = secretKey;
    24. }
    25. }

    3.4 通过MinIO配置类创建MinioClient,并注册进SpringIOC容器

    1. @Configuration //"配置类"注解
    2. @MapperScan({"xyz.aboluo.minio.dao"}) //dao接口包扫描
    3. //@EnableConfigurationProperties({Teacher.class})
    4. public class MinioAutoConfiguration {
    5. @Autowired
    6. private MinioProp minioProp;
    7. @Bean
    8. public MinioClient getMinioClient() {
    9. return MinioClient.builder()
    10. .endpoint(minioProp.getEndpoint())
    11. .credentials(minioProp.getAccessKey(), minioProp.getSecretKey())
    12. .build();
    13. }
    14. @Bean
    15. public CorsFilter corsFilter() {
    16. UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    17. CorsConfiguration corsConfiguration = new CorsConfiguration();
    18. corsConfiguration.addAllowedOrigin("*"); // 1 设置访问源地址(允许任何地址访问)
    19. corsConfiguration.addAllowedHeader("*"); // 2 设置访问源请求头(允许任何请求头访问)
    20. corsConfiguration.addAllowedMethod("*"); // 3 设置访问源请求方法(允许任何方法(GET,POST等等)方法)
    21. source.registerCorsConfiguration("/**", corsConfiguration); // 4 对接口配置跨域设置
    22. return new CorsFilter(source);
    23. }
    24. }

    3.5 Controller接口

    1. @RestController
    2. @RequestMapping("/minioFileHandle")
    3. public class MinioController {
    4. private static final Logger LOGGER = LoggerFactory.getLogger(MinioController.class);
    5. @Autowired
    6. private MinioClient minioClient;
    7. /**
    8. * 获取bucket列表
    9. *
    10. * @return
    11. */
    12. @RequestMapping("/bucketList.do")
    13. public Result bucketList() throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
    14. List> buckets = new ArrayList<>();
    15. for (Bucket bucket : minioClient.listBuckets()) {
    16. Map returnBucket = new HashMap<>();
    17. returnBucket.put("bucketName", bucket.name());
    18. returnBucket.put("creationDateTime", bucket.creationDate().toString());
    19. buckets.add(returnBucket);
    20. }
    21. return Result.success(buckets);
    22. }
    23. /**
    24. * 查询bucket下的所有文件信息
    25. *
    26. * @return
    27. */
    28. @RequestMapping("/queryBucketFiles.do")
    29. public Result queryBucketFiles(@RequestParam String bucketName) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
    30. //检查桶是否存在
    31. if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) {
    32. throw new SunnerRuntimeException(Result.ResultEnum.BUCKET_NOT_EXIST);
    33. }
    34. //遍历封装桶中的文件信息
    35. Iterator> iterator = minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).build()).iterator();
    36. List items = new ArrayList<>();
    37. while (iterator.hasNext()) {
    38. Item item = iterator.next().get();
    39. items.add(JSON.parse(String.format("{'fileName':'%s','fileSize':'%s','lastModified':'%s'}", item.objectName(), item.size(), Date.from(item.lastModified().toInstant()))));
    40. }
    41. return Result.success(items);
    42. }
    43. /**
    44. * 文件下载
    45. *
    46. * @return
    47. */
    48. @RequestMapping("/download.do")
    49. public Result download(@RequestParam String bucketName, @RequestParam String fileName, HttpServletResponse response) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
    50. response.setHeader("picture-upload-date-time", URLEncoder.encode("abccc", StandardCharsets.UTF_8));
    51. response.getOutputStream().write(minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).build()).readAllBytes());
    52. return Result.returnVoid();
    53. }
    54. }
    55. 相关阅读:
      SubDAO与Moonbeam网络集成
      Go 语言控制台输入&生成随机数
      Prometheus中关键设计
      程序员-你得把自己卖出去
      Linux 基础-文本处理命令
      Centos6.9安装redis-dump
      01 【前言 基础使用 核心概念】
      蓝桥杯单片机第八届省赛题详细讲解(模拟风扇控制系统)
      Linux常用命令整理
      C++提高篇:深入理解纯虚函数和抽象类
    56. 原文地址:https://blog.csdn.net/SunnerChen/article/details/137144772
      • 最新文章
      • 攻防演习之三天拿下官网站群
        数据安全治理学习——前期安全规划和安全管理体系建设
        企业安全 | 企业内一次钓鱼演练准备过程
        内网渗透测试 | Kerberos协议及其部分攻击手法
        0day的产生 | 不懂代码的"代码审计"
        安装scrcpy-client模块av模块异常,环境问题解决方案
        leetcode hot100【LeetCode 279. 完全平方数】java实现
        OpenWrt下安装Mosquitto
        AnatoMask论文汇总
        【AI日记】24.11.01 LangChain、openai api和github copilot
      • 热门文章
      • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
        奉劝各位学弟学妹们,该打造你的技术影响力了!
        五年了,我在 CSDN 的两个一百万。
        Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
        面试官都震惊,你这网络基础可以啊!
        你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
        心情不好的时候,用 Python 画棵樱花树送给自己吧
        通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
        13 万字 C 语言从入门到精通保姆级教程2021 年版
        10行代码集2000张美女图,Python爬虫120例,再上征途
      Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
      正则表达式工具 cron表达式工具 密码生成工具

      京公网安备 11010502049817号