SpringBoot中整合Minio文件存储的安装部署过程

下面就来分享一下"SpringBoot中整合Minio文件存储的安装部署过程"的攻略吧。

一、安装部署Minio

步骤1:下载Minio

Minio的官方网站 下载Minio服务端的压缩包。解压后,可以看到其中包含了可执行的minio程序。

步骤2:启动Minio

执行以下命令启动单节点Minio服务:

./minio server /data

其中/data为数据存放目录,你可以自己设置。

步骤3:访问Minio

默认情况下,Minio使用http://localhost:9000 访问服务,可以在浏览器中打开该链接进行访问。如果可以看到Minio的登录界面,那么恭喜你,Minio服务端已经部署成功。

二、SpringBoot中整合Minio

步骤1:添加Maven依赖

在 pom.xml 中添加以下依赖:

<!-- Minio客户端 -->
<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>7.2.1</version>
</dependency>

步骤2:配置文件添加Minio信息

在 application.yml 文件中添加以下Minio相关的配置信息:

# Minio客户端设置
minio:
  endpoint: http://localhost:9000 # Minio服务端的URL
  accessKey: S3_ACCESS_KEY # Minio服务端的Access Key
  secretKey: S3_SECRET_KEY # Minio服务端的Secret Key
  bucketName: minio-bucket # Minio服务端的存储桶名称

步骤3:编写服务代码

可以定义一个服务类,用于操作Minio存储桶,示例代码如下:

@Service
public class MinioService {
    private final MinioClient minioClient;
    private final String bucketName;

    public MinioService(
            @Value("${minio.endpoint}") String endpoint,
            @Value("${minio.accessKey}") String accessKey,
            @Value("${minio.secretKey}") String secretKey,
            @Value("${minio.bucketName}") String bucketName) throws Exception {
        this.minioClient = new MinioClient(endpoint, accessKey, secretKey);
        this.bucketName = bucketName;
        if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) {
            minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
        }
    }

    public void uploadFile(String fileName, byte[] content) throws Exception {
        PutObjectArgs args = PutObjectArgs.builder()
                .bucket(bucketName)
                .object(fileName)
                .stream(new ByteArrayInputStream(content), content.length, -1)
                .build();
        minioClient.putObject(args);
    }

    public byte[] downloadFile(String fileName) throws Exception {
        GetObjectArgs args = GetObjectArgs.builder()
                .bucket(bucketName)
                .object(fileName)
                .build();
        InputStream is = minioClient.getObject(args);
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        byte[] buf = new byte[1024];
        int len;
        while ((len = is.read(buf)) != -1) {
            bos.write(buf, 0, len);
        }
        return bos.toByteArray();
    }
}

步骤4:测试代码

在Controller类中实现文件上传、下载的测试接口,示例如下:

@RestController
public class FileController {
    @Autowired
    private MinioService minioService;

    @PostMapping("/file/upload")
    public String uploadFile(@RequestParam("file") MultipartFile file) {
        try {
            minioService.uploadFile(file.getOriginalFilename(), file.getBytes());
        } catch (Exception e) {
            e.printStackTrace();
            return "上传文件失败:" + e.getMessage();
        }

        return "上传文件成功";
    }

    @GetMapping(value = "/file/download")
    public ResponseEntity<byte[]> downloadFile(@RequestParam("fileName") String fileName) {
        byte[] content = null;
        try {
            content = minioService.downloadFile(fileName);
        } catch (Exception e) {
            e.printStackTrace();
        }

        HttpHeaders headers = new HttpHeaders();
        headers.add("Content-Type", "application/octet-stream");
        headers.add("Content-Disposition", "attachment;filename=" + fileName);
        HttpStatus httpStatus = HttpStatus.OK;
        ResponseEntity<byte[]> responseEntity = new ResponseEntity<byte[]>(content, headers, httpStatus);
        return responseEntity;
    }
}

三、示例说明

示例1:上传图片到Minio

@GetMapping("/image/upload")
public String uploadImage(@RequestParam("file") MultipartFile file) {
    try {
        minioService.uploadFile(file.getOriginalFilename(), file.getBytes());
    } catch (Exception e) {
        e.printStackTrace();
        return "上传图片失败:" + e.getMessage();
    }
    return "上传图片成功";
}

示例2:下载图片到本地

@GetMapping("/image/download")
public void downloadImage(@RequestParam("fileName") String fileName, HttpServletResponse response) {
    byte[] content = null;
    try {
        content = minioService.downloadFile(fileName);
    } catch (Exception e) {
        e.printStackTrace();
    }

    if (content != null) {
        OutputStream os = null;
        try {
            os = response.getOutputStream();
            response.setContentType("application/octet-stream;charset=utf-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
            os.write(content);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (os != null) {
                try {
                    os.flush();
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

以上就是"SpringBoot中整合Minio文件存储的安装部署过程"的完整攻略了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot中整合Minio文件存储的安装部署过程 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • SpringBoot获取yml和properties配置文件的内容

    Spring Boot 是一款基于 Spring 框架的快速 Web 开发工具,可以非常方便的实现 Web 服务的快速搭建,其中获取 yml 和 properties 配置文件的内容也是非常常见的操作。下面就是关于该操作的完整攻略: 获取 yml 文件中的配置项 获取 yml 文件中的配置项可以通过 @ConfigurationProperties 注解来实…

    other 2023年6月25日
    00
  • 简单谈谈C语言中的= 和==、!=

    简单谈谈C语言中的= 和==、!= 在C语言中,我们常常会用到赋值符号“=”,以及两个等于符号“==”和一个不等于符号“!=”。这三个符号虽然都是“等于”的表示符号,但其实它们代表的意义是不同的,容易混淆和出错。下面我们就对它们进行详细讲解: 赋值符号“=”的作用 赋值符号“=”是赋值运算符号,表示将右边的值赋给左边的变量,例如: int a = 10; /…

    other 2023年6月27日
    00
  • CSS的一些编程规范总结

    CSS的一些编程规范总结 在编写CSS代码时,遵循一些规范可以提高代码的可读性和可维护性。以下是一些常见的CSS编程规范的总结。 1. 选择器命名规范 选择器命名应该具有描述性,清晰明了,以便于他人理解和维护代码。以下是一些选择器命名的最佳实践: 使用有意义的名称:选择器名称应该能够准确地描述所选择的元素。避免使用无意义的名称或缩写。 使用小写字母和短横线:…

    other 2023年9月6日
    00
  • antdresetfields怎么用

    antdresetfields怎么用 Ant Design是一款基于React的UI组件库,由阿里巴巴的蚂蚁金服负责开发。antd中提供了一些方便的工具函数,比如resetFields函数,可以用于清空Antd表单中的所有数据。 resetFields用法 resetFields函数需要在表单组件实例上进行调用,用法如下: class MyForm exte…

    其他 2023年3月28日
    00
  • Android OpenGL入门之GLSurfaceView

    Android OpenGL入门之GLSurfaceView攻略 简介 GLSurfaceView是Android平台上用于显示OpenGL图形的视图组件。它提供了一个方便的方式来创建和管理OpenGL上下文,并处理与绘制相关的任务。本攻略将详细介绍如何使用GLSurfaceView来入门Android OpenGL编程。 步骤 步骤一:创建GLSurfac…

    other 2023年8月3日
    00
  • C++面试八股文之override和finial关键字有何作用

    C++面试八股文之override和final关键字 概述 在C++中,override和final是C++11引入的关键字,用于规范派生类继承基类的方式,提高代码健壮性和可读性。本文将对override和final关键字的用法进行详细介绍。 override关键字 在C++中,派生类继承基类的方式一般有三种:公有继承、保护继承和私有继承。在进行派生类的重写…

    other 2023年6月27日
    00
  • 分享Python 加速运行技巧

    分享Python 加速运行技巧攻略 Python 是一种解释型语言,相对于编译型语言来说,其执行速度可能较慢。然而,有许多技巧可以帮助加速 Python 程序的运行。本攻略将介绍一些常用的 Python 加速运行技巧,并提供两个示例说明。 1. 使用适当的数据结构 选择适当的数据结构可以显著提高 Python 程序的性能。以下是一些常见的数据结构和其适用场景…

    other 2023年7月29日
    00
  • DevExpress WinForms v18.2新版亮点(八)

    DevExpress WinForms v18.2新版亮点(八) DevExpress WinForms是一款功能强大的桌面应用程序开发工具包。在其新版v18.2中,有很多值得注意的亮点,下面为您介绍其中的一些: 1. 同时激活多个皮肤 在之前的版本中,DevExpress的皮肤必须通过单个调用SetActiveLookAndFeel方法来激活。然而,在v1…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部