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日

相关文章

  • 【转】排名前十位的linux发行版介绍

    以下是关于“【转】排名前十位的Linux发行版介绍”的完整攻略: Linux发行版简介 Linux发行版是基于Linux内核的操作系统,由不同的开发者和组织维护和发布。Linux发行版通常包含了Linux内核、软件包管理器、桌面环境、应用程序等组件,可以用于桌面、服务器、嵌入式等不同的场景。 排名前十Linux发行版介绍 以下是一些排名前十位的Linux发行…

    other 2023年5月9日
    00
  • Java框架设计灵魂之反射的示例详解

    Java框架设计中的反射是非常重要的一环,它可以让我们在运行时动态地获取并操作对象信息。下面详细讲解“Java框架设计灵魂之反射的示例详解”的完整攻略。 什么是反射 Java反射是指程序可以在运行时动态获取类的信息并操作对象的属性、方法等。在Java中,反射可以通过java.lang.reflect包中的类实现。 反射的用途 反射有很多用途,比如: 动态地创…

    other 2023年6月27日
    00
  • c++-如何解决wsaewouldblock错误

    在C++中,当使用套接字进行网络编程时,可能会遇到WSAEWOULDBLOCK错误。这个错误通常表示套接字正在等待数据,但没有数据可用。本文将提供一些关于如何解决WSAEWOULDBLOCK错误的详细说明,包括如何使用非阻塞套接字、如何使用select函数等。 使用非阻塞套接字 非阻塞套接字是一种特殊类型的套接,它允许程序在等待数据时继续执行其他任务。当使用…

    other 2023年5月9日
    00
  • python入门课程第四讲之内置数据类型有哪些

    Python入门课程第四讲之内置数据类型有哪些 概述 在Python中,数据可以分为不同的类型,例如:字典、列表、元组、集合等。这些类型被称为“内置数据类型”。 在本文中,我们将介绍Python中的内置数据类型,包括它们各自的特点和用法。 列表(list) 列表是Python中最常用的数据类型之一。它允许我们在一个变量中存储多个值。列表中的值可以是任意数据类…

    other 2023年6月27日
    00
  • 获取MSSQL 表结构中字段的备注、主键等信息的sql

    获取MSSQL 表结构中字段的备注、主键等信息的SQL,可通过查询系统表和视图来完成。 以下是获取列备注和主键信息的示例SQL: 获取表中所有列的备注信息和主键信息 SELECT c.name AS ColumnName, t.name AS DataType, c.is_nullable AS Nullable, p.value AS ColumnDesc…

    other 2023年6月25日
    00
  • SQL Server数据表字段自定义自增数据格式的方法

    不同于MySQL的自增,SQL Server的自增需要通过创建序列对象来实现。以下是SQL Server数据表字段自定义自增数据格式的完整攻略: 步骤一:创建序列对象 在SQL Server中,通过创建序列对象来实现自定义自增数据格式。使用以下语句可以创建一个序列对象: CREATE SEQUENCE Table_Seq START WITH 1001 IN…

    other 2023年6月25日
    00
  • Java创建数组的几种方式总结

    Java创建数组的几种方式总结 在Java中,创建数组是非常常见的操作。这里总结了Java中创建数组的几种方式,希望对大家的学习有所帮助。 一、声明并初始化 int[] arr = {1, 2, 3}; 这种方式是最常用的创建数组的方式之一,既可以声明数组变量,又可以同时初始化数组元素。在这里,我们创建了一个包含3个元素的数组,并把它们初始化为1、2、3。 …

    other 2023年6月25日
    00
  • Android单个RecyclerView实现列表嵌套的效果

    Android单个RecyclerView实现列表嵌套的效果攻略 在Android开发中,有时候我们需要在一个RecyclerView中实现列表嵌套的效果,即在一个列表项中再展示一个子列表。下面是一个详细的攻略,教你如何实现这个效果。 步骤一:准备工作 首先,我们需要在项目的build.gradle文件中添加RecyclerView的依赖: implemen…

    other 2023年7月27日
    00
合作推广
合作推广
分享本页
返回顶部