docker-compose 搭建 MinIO

目录

  • 1、搭建单机MinIO

1、搭建单机MinIO

(1)配置 docker-compose.yml

minio:
image: minio/minio
container_name: "chain-minio"
ports:
- 9000:9000 # 服务端口
- 9090:9090 # 控制台端口
environment:
- "MINIO_ACCESS_KEY=admin" # 登陆账号
- "MINIO_SECRET_KEY=12345678" # 密码
volumes: # 挂载数据卷
- "/dockerdata/minio/data:/data"
- "/dockerdata/minio/config:/root/.minio"
command: server /data --console-address ":9090" # 容器启动时执行的指令
restart: always # 容器退出时总是重启容器

(2)执行docker-compose.yml

docker-compose up -d

(3)执行过后,在主机访问 控制台

服务器ip:9090

在这里插入图片描述
在控制台创建 Bucket。创建账户获取 Key 和 Secret

(4)运用 java sdk

pom.xml 添加依赖:

<!--     minio    -->
<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>8.4.2</version>
</dependency>

application.yml 添加配置:

# minio 配置
minio:
  url: http://192.168.182.135:9000 # 对象存储服务的URL
  accessKey: admin # Access key 账户
  secretKey: 12345678  # Secret key 密码

这里的 accessKey 和 secretKey 可以是登录控制台的账户和密码,也可以是在控制台新增的账户
例如

# minio 配置
minio:
  url: http://192.168.182.135:9000  #对象存储服务的URL
  accessKey: 5JT8GZMHP4P9CP3UIVOJ # Access key账户
  secretKey: ixElQtTEVnn2s+BgkAfE+0LmTDqlZMBrzH1HJ51o # Secret key 密码

添加 Config

@Configuration
public class MinioConfig {
    @Value("${minio.url}")
    private  String url;
    @Value("${minio.accessKey}")
    private String accessKey;
    @Value("${minio.secretKey}")
    private String secretKey;

    @Bean
    public MinioClient getMinioClient() {
        MinioClient minioClient = MinioClient
                .builder()
                .endpoint(url)
                .credentials(accessKey, secretKey)
                .build();
        return minioClient;
    }
}

MinioUtil

@Component
public class MinioUtil {
    @Resource
    private MinioClient minioClient;

    /**
     * 创建一个桶
     */
    public void createBucket(String bucket) throws Exception {
        boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucket).build());
        if (!found) {
            minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucket).build());
        }
    }

    /**
     * 上传一个文件
     */
    public void uploadFile(InputStream stream, String bucket, String objectName) throws Exception {
        minioClient.putObject(PutObjectArgs.builder().bucket(bucket).object(objectName)
                .stream(stream, -1, 10485760).build());
    }

    /**
     * 列出所有的桶
     */
    public List<String> listBuckets() throws Exception {
        List<Bucket> list = minioClient.listBuckets();
        List<String> names = new ArrayList<>();
        list.forEach(b -> {
            names.add(b.name());
        });
        return names;
    }

    /**
     * 下载一个文件
     */
    public InputStream download(String bucket, String objectName) throws Exception {
        InputStream stream = minioClient.getObject(
                GetObjectArgs.builder().bucket(bucket).object(objectName).build());
        return stream;
    }

    /**
     * 删除一个桶
     */
    public void deleteBucket(String bucket) throws Exception {
        minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucket).build());
    }

    /**
     * 删除一个对象
     */
    public void deleteObject(String bucket, String objectName) throws Exception {
        minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucket).object(objectName).build());
    }
}

写个 Controller 测试

@Api(tags = "文件操作接口")
@RestController
public class MinioController{
    @Resource
    MinioUtil minioUtil;

    @ApiOperation("上传一个文件")
    @RequestMapping(value = "/uploadfile", method = RequestMethod.POST)
    @ResponseBody
    public Response<Integer> fileupload(@RequestParam MultipartFile uploadfile, @RequestParam String bucket,
                               @RequestParam(required=false) String objectName) throws Exception {
        minioUtil.createBucket(bucket);
        if (objectName != null) {
            minioUtil.uploadFile(uploadfile.getInputStream(), bucket, "/"+uploadfile.getOriginalFilename());
        } else {
            minioUtil.uploadFile(uploadfile.getInputStream(), bucket, uploadfile.getOriginalFilename());
        }
        return ResponseUtils.success(1);
    }

    @ApiOperation("下载一个文件")
    @RequestMapping(value = "/downloadFile", method = RequestMethod.GET)
    @ResponseBody
    public void downloadFile(@RequestParam String bucket, @RequestParam String objectName,
                             HttpServletResponse response) throws Exception {
        InputStream stream = minioUtil.download(bucket, objectName);
        ServletOutputStream output = response.getOutputStream();
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(objectName.substring(objectName.lastIndexOf("/") + 1), "UTF-8"));
        response.setContentType("application/octet-stream");
        response.setCharacterEncoding("UTF-8");
        IOUtils.copy(stream, output);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/7809.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Python入门第四十七天】Python丨NumPy 数组迭代

数组迭代 迭代意味着逐一遍历元素&#xff0c;当我们在 numpy 中处理多维数组时&#xff0c;可以使用 python 的基本 for 循环来完成此操作。 如果我们对 1-D 数组进行迭代&#xff0c;它将逐一遍历每个元素。 实例 迭代以下一维数组的元素&#xff1a; import numpy as n…

Mysql忘记密码或者有修改密码的需求

今天突然有个想法&#xff0c;想要把毕设弄到服务器上去&#xff0c;所以要配置一下环境安装一下使用一下MySQL&#xff0c;导入一下SQL脚本来创建数据&#xff1b;结果长时间不用MySQL密码不记得了&#xff0c;最后参考了一些博主发现可以这样子修改。 1、打开mysql的配置文件…

OA系统是什么意思?企业为什么要用OA办公系统软件?

阅读本文您将了解&#xff1a;1、什么是OA&#xff1b;2、OA系统是什么意思&#xff1b;2、OA系统功能和对企业重要性 什么是OA&#xff1f; OA即办公自动化&#xff08;Office Automation&#xff0c;简称OA&#xff09;&#xff0c;是将计算机、通信等现代化技术运用到传统…

《剑指offer》——二进制中1的个数

首先&#xff0c;拿到问题不要害怕&#xff0c;我们先来看一下题目说的是什么&#xff1a; 示例1 输入&#xff1a; 10返回值&#xff1a; 2说明&#xff1a; 十进制中10的32位二进制表示为0000 0000 0000 0000 0000 0000 0000 1010&#xff0c;其中有两个1。 示例2 输入&#…

将Linux服务器上的项目上传至Github

使用git上传项目到github常规的步骤继续上传注意事项参考文章常规的步骤 初始化git空间 git init向缓冲区添加想要上传的文件 git add -f /data/xuhongbo/xuhongbo.code/unbiased_sgg_xuhongbo_BCL/maskrcnn_benchmark/*添加备注信息告诉机器&#xff0c;你真的要添加上述文…

vue在input中输入后,按回车,提交数据

vue在input中输入后&#xff0c;按回车&#xff0c;提交数据 1.展示效果如下&#xff1a; 2.代码展示&#xff1a; <div><el-input v-model"toAddNameText" keyup.enter.native"toAddName()" placeholder"回车&#xff0c;即新增该竖杆名称…

【C++】list的使用与模拟实现

目录 一、list介绍 二、list的使用 1、list的构造 2、list capacity 3、list element access 4、list iterator 5、list modifiers 5.1、insert 6、list Operations 6.1、sort 7、list的迭代器失效 三、list模拟实现 1、push_back 2、iterator 3、const iterato…

循环神经网络

循环神经网络(Recurrent Neural Network&#xff0c;RNN)与卷积神经网络一样,都是深度学习中的重要部分。循环神经网络可以看作一类具有短期记忆能力的神经网络。在循环神经网络中&#xff0c;神经元不但可以接收其他神经元的信息&#xff0c;也可以接收自身的信息&#xff0c;…

Python实现PDF转Word文档

1. 模块安装 pip install pdf2docx安装时可能报错&#xff1a; 到 Microsoft C Build Tools 下载C编译环境安装即可。 2. 模块介绍 pdf2docx是一个Python模块&#xff0c;可以用来将PDF文件转换成Word文档。它是基于Python的pdfminer和python-docx库开发的&#xff0c;可以…

toArray转换 java.lang.ClassCastException

[toArray转换踩坑 java.lang.ClassCastException] 问题 List<String> auditOptions Lists.newArrayList(); //一系列灌数据操作 auditOption.add... String[] options (String[]) auditOptions.toArray();报错信息java.lang.ClassCastException: class [Ljava.lang.O…

【Blender】如何在Blender中添加HDRI环境贴图

​ 什么是HDRI环境贴图 环境贴图或HDRI贴图是在Blender中照亮3D场景并实现逼真效果的最有效和最快捷的方法之一。 HDRIs本质上是现实世界照明的快照&#xff0c;其中包含高动态范围成像&#xff08;HDRI&#xff09;的准确照明细节。HDRI是一个包含亮度信息&#xff08;从暗…

ToBeWritten之IoT 技战法

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 转移发布平台通知&#xff1a;将不再在CSDN博客发布新文章&#xff0c;敬…

VMware ESXi 8.0c - 领先的裸机 Hypervisor (sysin Custom Image)

本站发布 Dell 和 HPE 定制版 ESXi 8.0c 镜像 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-esxi-8/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 产品简介 VMware ESXi&#xff1a;专门构建的裸机 Hyperviso…

问卷调查怎么帮助餐饮行业?

在餐饮行业中&#xff0c;顾客的口碑占据非常重要的地位&#xff0c;直接影响着门店的销售额。好口碑能一传十、十传百&#xff0c;为门店带来持续不断的流量和收益。所以&#xff0c;在顾客体验这一块&#xff0c;餐饮门店要尤为重视。 某餐饮品牌作为全球知名品牌&#xff0…

MongoDB【使用场景简介体系结构数据模型特点】

目录 1&#xff1a;MongoDB相关概念 1.1&#xff1a;业务应用场景 1.2&#xff1a;MongoDB简介 1.3&#xff1a;体系结构 1.4&#xff1a;数据模型 1.5&#xff1a;MongoDB的特点 1&#xff1a;MongoDB相关概念 1.1&#xff1a;业务应用场景 传统的关系型数据库&#x…

AOP原理 - 分析AnnotationAwareAspectJAutoProxyCreator源码

文章目录一、回顾EnableAspectJAutoProxy二、AbstractAutoProxyCreator类三、AbstractAdvisorAutoProxyCreator类四、AspectJAwareAdvisorAutoProxyCreator类五、AnnotationAwareAspectJAutoProxyCreator类一、回顾EnableAspectJAutoProxy 在上一章中&#xff0c;通过查看Enabl…

Spring原理学习(三):BeanFactory后处理器原理解析与模拟实现

一、简单认识BeanFactory后处理器 1.1 BeanFactory后处理器的作用 接前文&#xff1a;Spring原理学习&#xff08;一&#xff09;&#xff1a;BeanFactory和ApplicationContext的原理和实现 我们已经简单介绍了 BeanFactory后处理器 的作用&#xff0c;今天我们先再来再次体验…

酒店拥有VR全景是一种什么样的体验?

每一家酒店都希望自己门庭若市&#xff0c;有更多的人来&#xff0c;随着信息化和互联网的发展时代的到来&#xff0c;酒店营销也逐渐加入了更多的现代元素&#xff0c;那么&#xff0c;酒店怎么样更好地利用互联网来做宣传、来获得更多的客户呢&#xff1f;VR全景作为新兴的富…

排序和分页

排序和分页一、排序1.简单用法3.不同字段不同排序现实二、分页1.简单分页2.order by 配合limit三、分页8.0新特性1.offset总结提示&#xff1a;以下是本篇文章正文内容 一、排序 1.简单用法 select employee_id,last_name,salary from employees order by salary;默认是升序…

Maven高级-分模块开发依赖管理

Maven高级-分模块开发&依赖管理1&#xff0c;分模块开发1.1 分模块开发设计1.2 分模块开发实现1.2.1 环境准备1.2.2 抽取domain层步骤1:创建新模块步骤2:项目中创建domain包步骤3:删除原项目中的domain包步骤4:建立依赖关系步骤5:编译maven_02_ssm项目步骤6:将项目安装本地…