如何使用Spring Boot和MinIO实现文件上传、读取、下载和删除的功能?

简介: 如何使用Spring Boot和MinIO实现文件上传、读取、下载和删除的功能?

引言

在现代Web应用程序开发中,文件的上传、读取、下载和删除是非常常见的功能。Spring Boot 是一个流行的Java框架,而MinIO则是一个高性能的对象存储服务。本文将详细介绍如何使用Spring Boot和MinIO实现文件上传、读取、下载和删除的功能。

准备工作

在开始之前,需要进行一些准备工作:

  1. 安装Java JDK并配置好环境变量。
  2. 安装Maven构建工具。
  3. 创建一个新的Spring Boot项目。

步骤一:添加所需依赖

首先,在项目的pom.xml文件中添加以下依赖:

<dependencies>
    <!-- Spring Boot Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- MinIO Java SDK -->
    <dependency>
        <groupId>io.minio</groupId>
        <artifactId>minio</artifactId>
        <version>8.4.0</version>
    </dependency>
</dependencies>

这里我们添加了Spring Boot Web依赖以及MinIO Java SDK依赖。

步骤二:配置MinIO连接信息

在application.properties(或application.yml)文件中添加MinIO连接信息:

# MinIO连接信息
minio.url=http://localhost:9000
minio.accessKey=minio_access_key
minio.secretKey=minio_secret_key

这里需要将minio.urlminio.accessKeyminio.secretKey替换为你实际使用的MinIO连接信息。

步骤三:编写文件上传接口

创建一个新的REST Controller类,用于处理文件上传:

@RestController
public class FileController {
   
   

    @Value("${minio.url}")
    private String minioUrl;

    @Value("${minio.accessKey}")
    private String minioAccessKey;

    @Value("${minio.secretKey}")
    private String minioSecretKey;

    // 文件上传接口
    @PostMapping("/upload")
    public String uploadFile(@RequestParam("file") MultipartFile file) {
   
   
        try {
   
   
            // 创建MinIO客户端
            MinioClient minioClient = MinioClient.builder()
                    .endpoint(minioUrl)
                    .credentials(minioAccessKey, minioSecretKey)
                    .build();

            // 生成随机文件名
            String filename = UUID.randomUUID().toString() + "-" + file.getOriginalFilename();

            // 使用putObject方法上传文件
            minioClient.putObject(PutObjectArgs.builder()
                    .bucket("my-bucket") // 替换为你实际的存储桶名称
                    .object(filename)
                    .stream(file.getInputStream(), file.getSize(), -1)
                    .contentType(file.getContentType())
                    .build());

            return "文件上传成功";
        } catch (Exception e) {
   
   
            e.printStackTrace();
            return "文件上传失败:" + e.getMessage();
        }
    }
}

这个接口使用@PostMapping注解定义了一个文件上传的POST请求接口。在方法内部,我们首先获取MinIO连接信息,并创建MinioClient实例。然后,生成一个随机文件名,使用putObject方法将文件上传到指定的存储桶中。

请注意,这里的存储桶名称需要根据你实际的需求进行替换。

步骤四:编写文件读取接口

继续在FileController类中添加一个文件读取的接口:

@GetMapping("/read/{filename}")
public ResponseEntity<InputStreamResource> readFile(@PathVariable String filename) {
   
   
    try {
   
   
        // 创建MinIO客户端
        MinioClient minioClient = MinioClient.builder()
                .endpoint(minioUrl)
                .credentials(minioAccessKey, minioSecretKey)
                .build();

        // 获取文件流
        GetObjectResponse objectResponse = minioClient.getObject(GetObjectArgs.builder()
                .bucket("my-bucket") // 替换为你实际的存储桶名称
                .object(filename)
                .build());

        InputStream inputStream = objectResponse;

        // 设置响应头
        HttpHeaders headers = new HttpHeaders();
        headers.add(HttpHeaders.CONTENT_TYPE, objectResponse.contentType());

        return ResponseEntity.ok()
                .headers(headers)
                .body(new InputStreamResource(inputStream));
    } catch (Exception e) {
   
   
        e.printStackTrace();
        return ResponseEntity.notFound().build();
    }
}

这个接口使用@GetMapping注解定义了一个文件读取的GET请求接口。在方法内部,我们首先获取MinIO连接信息,并创建MinioClient实例。然后,使用getObject方法获取文件流,并将其封装为InputStreamResource对象。

步骤五:编写文件下载接口

在FileController类中继续添加一个文件下载的接口:

@GetMapping("/download/{filename}")
public ResponseEntity<InputStreamResource> downloadFile(@PathVariable String filename) {
   
   
    try {
   
   
        // 创建MinIO客户端
        MinioClient minioClient = MinioClient.builder()
                .endpoint(minioUrl)
                .credentials(minioAccessKey, minioSecretKey)
                .build();

        // 获取文件流
        GetObjectResponse objectResponse = minioClient.getObject(GetObjectArgs.builder()
                .bucket("my-bucket") // 替换为你实际的存储桶名称
                .object(filename)
                .build());

        InputStream inputStream = objectResponse;

        // 设置响应头
        HttpHeaders headers = new HttpHeaders();
        headers.add(HttpHeaders.CONTENT_TYPE, objectResponse.contentType());
        headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + filename + "\"");

        return ResponseEntity.ok()
                .headers(headers)
                .body(new InputStreamResource(inputStream));
    } catch (Exception e) {
   
   
        e.printStackTrace();
        return ResponseEntity.notFound().build();
    }
}

这个接口也使用@GetMapping注解定义了一个文件下载的GET请求接口。与文件读取接口类似,我们首先获取MinIO连接信息,并创建MinioClient实例。然后,使用getObject方法获取文件流,并将其封装为InputStreamResource对象。

不同之处在于,我们设置了Content-Disposition响应头,指定文件的下载方式。

步骤六:编写文件删除接口

最后,在FileController类中添加文件删除的接口:

@DeleteMapping("/delete/{filename}")
public String deleteFile(@PathVariable String filename) {
   
   
    try {
   
   
        // 创建MinIO客户端
        MinioClient minioClient = MinioClient.builder()
                .endpoint(minioUrl)
                .credentials(minioAccessKey, minioSecretKey)
                .build();

        // 删除文件
        minioClient.removeObject(RemoveObjectArgs.builder()
                .bucket("my-bucket") // 替换为你实际的存储桶名称
                .object(filename)
                .build());

        return "文件删除成功";
    } catch (Exception e) {
   
   
        e.printStackTrace();
        return "文件删除失败:" + e.getMessage();
    }
}

这个接口使用@DeleteMapping注解定义了一个文件删除的DELETE请求接口。在方法内部,我们首先获取MinIO连接信息,并创建MinioClient实例。然后,使用removeObject方法从指定的存储桶中删除文件。

测试

完成以上步骤后,你可以启动Spring Boot应用程序,并使用任何HTTP客户端(如Postman)来测试文件上传、读取、下载和删除的功能。

例如,使用POST方法请求http://localhost:8080/upload接口来上传文件,使用GET方法请求http://localhost:8080/read/{filename}接口来读取文件,使用GET方法请求http://localhost:8080/download/{filename}接口来下载文件,使用DELETE方法请求http://localhost:8080/delete/{filename}接口来删除文件。

请记得根据实际情况替换URL中的{filename}和存储桶名称。

结论

通过使用Spring Boot和MinIO,我们可以方便地实现文件上传、读取、下载和删除的功能。在实际应用中,你可能还需要添加更多的功能,如文件列表、权限控制等。希望本文对你有所帮助,祝你在使用Spring Boot和MinIO开发文件管理功能时取得成功!

目录
相关文章
|
XML 前端开发 Java
SpringBoot实现文件上传下载功能
本文介绍了如何使用SpringBoot实现文件上传与下载功能,涵盖配置和代码实现。包括Maven依赖配置(如`spring-boot-starter-web`和`spring-boot-starter-thymeleaf`)、前端HTML页面设计、WebConfig路径映射配置、YAML文件路径设置,以及核心的文件上传(通过`MultipartFile`处理)和下载(利用`ResponseEntity`返回文件流)功能的Java代码实现。文章由Colorful_WP撰写,内容详实,适合开发者学习参考。
1157 0
|
XML Java API
SpringBoot 整合 Minio
本文介绍了如何在服务器上安装并配置Minio服务,包括Minio的依赖、配置类以及基本操作。首先,通过Maven添加Minio依赖;接着,在`yml`文件中配置Minio的连接信息;然后,创建`MinIoClientConfig`类将MinioClient注入到Spring容器中;最后,定义`OSSFileService`接口及其实现类`OssFileServiceImpl`,实现文件上传、获取文件URL、临时访问URL和删除文件等操作。
510 2
|
存储 Java 文件存储
Spring Boot 3 整合 Minio 实现文件存储
本文介绍了如何使用 Spring Boot 3 整合 MinIO 实现文件存储服务。MinIO 是一款高性能的对象存储服务器,适合大规模数据存储与分析,支持多种部署环境且文档完备、开源免费。从 MinIO 的快速安装、配置文件公开访问,到 Spring Boot 中集成 MinIO 客户端的步骤,包括创建用户访问密钥、引入依赖包、添加配置信息、编写 MinIO 客户端配置类及上传和预览文件的服务代码。最后通过 Apifox 进行文件上传测试,并验证文件是否成功存储及预览功能是否正常。关注公众号“Harry技术”,回复 minio 获取源码地址。
1459 76
|
存储 Java 文件存储
🗄️Spring Boot 3 整合 MinIO 实现分布式文件存储
本文介绍了如何基于Spring Boot 3和MinIO实现分布式文件存储。随着应用规模扩大,传统的单机文件存储方案难以应对大规模数据和高并发访问,分布式文件存储系统成为更好的选择。文章详细讲解了MinIO的安装、配置及与Spring Boot的整合步骤,包括Docker部署、MinIO控制台操作、Spring Boot项目中的依赖引入、配置类编写及工具类封装等内容。最后通过一个上传头像的接口示例展示了具体的开发和测试过程,强调了将API操作封装成通用工具类以提高代码复用性和可维护性的重要性。
2811 7
🗄️Spring Boot 3 整合 MinIO 实现分布式文件存储
|
存储 Java Linux
SpringBoot × MinIO 极速开发指南:对象存储服务高可用实战
生成临时访问URL接口和文件预览其实是同一个方法,只是文件预览内定了七天访问,而这个方法可以自行制定,单位是秒。方法,所以返回的是地址信息,但是可以通过dubug看到Bucket中的属性,确实是当前所有桶信息。配置类中奖MinIOClient客户端注入到Springboot中。MinIO集群的在Linux上的部署可以参考:​​​​​​​。Nginx代理MinIO集群可以参考:​​​​​​​。从Bucket源码可以看出,并没有实现。
1110 0
|
XML Java Kotlin
springboot + minio + kkfile实现文件预览
本文介绍了如何在容器中安装和启动kkfileviewer,并通过Spring Boot集成MinIO实现文件上传与预览功能。首先,通过下载kkfileviewer源码并构建Docker镜像来部署文件预览服务。接着,在Spring Boot项目中添加MinIO依赖,配置MinIO客户端,并实现文件上传与获取预览链接的接口。最后,通过测试验证文件上传和预览功能的正确性。
1886 4
springboot + minio + kkfile实现文件预览
|
XML Java API
Spring Boot集成MinIO
本文介绍了如何在Spring Boot项目中集成MinIO,一个高性能的分布式对象存储服务。主要步骤包括:引入MinIO依赖、配置MinIO属性、创建MinIO配置类和服务类、使用服务类实现文件上传和下载功能,以及运行应用进行测试。通过这些步骤,可以轻松地在项目中使用MinIO的对象存储功能。
2131 5
|
前端开发 Java easyexcel
SpringBoot操作Excel实现单文件上传、多文件上传、下载、读取内容等功能
SpringBoot操作Excel实现单文件上传、多文件上传、下载、读取内容等功能
1104 8
|
存储 前端开发 JavaScript
SpringBoot结合Minio实现文件切片极速上传
【10月更文挑战第21天】
1032 6

热门文章

最新文章