御坂主机 发表于 2024-6-13 13:48:11

Spring Boot轻松整合Minio实现文件上传下载功能

本帖最后由 御坂主机 于 2024-6-13 14:47 编辑

1. 引言

在现代Web应用中,文件上传和下载是常见的功能需求。Spring Boot作为一个流行的Java框架,提供了简洁的方式来实现这些功能。而Minio是一个高性能的对象存储服务器,兼容Amazon S3 API,非常适合用于文件存储。本文将介绍如何通过Spring Boot轻松整合Minio实现文件的上传和下载功能。

1.1 准备工作

在开始实际编码之前,我们需要准备以下环境和工具:

(1) Java 8或更高版本
(2) Spring Boot 2.x
(3) Minio服务器
(4) 一个合适的IDE,如IntelliJ IDEA

1.2 Minio服务器配置

首先,需要在本地或远程启动一个Minio服务器。可以通过以下命令启动Minio:

minio server /data

启动后,Minio服务器默认运行在9000端口,可以通过http://localhost:9000访问其Web界面。初始启动时会提供访问密钥和秘密密钥,注意保存这两个密钥,后续Spring Boot配置中会使用到。

2. Spring Boot项目配置

2.1 创建Spring Boot项目

可以通过Spring Initializr(https://start.spring.io/)快速生成一个Spring Boot项目,选择以下依赖:

(1) Spring Web
(2) Lombok
(3) Spring Boot DevTools

下载并解压生成的项目,并使用IDE打开。

2.2 添加Minio依赖

在pom.xml文件中添加Minio客户端依赖:

<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>8.3.0</version>
</dependency>

2.3 配置文件

在src/main/resources目录下的application.properties文件中添加Minio配置:

minio.url=http://localhost:9000
minio.access-key=your-access-key
minio.secret-key=your-secret-key
minio.bucket-name=your-bucket-name

3. 实现文件上传和下载功能

3.1 配置类

首先,创建一个配置类用于配置Minio客户端:

package com.example.demo.config;

import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MinioConfig {

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

    @Value("${minio.access-key}")
    private String accessKey;

    @Value("${minio.secret-key}")
    private String secretKey;

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

3.2 服务类

接下来,创建一个服务类用于处理文件上传和下载逻辑:

package com.example.demo.service;

import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import io.minio.GetObjectArgs;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;

@Service
public class MinioService {

    @Autowired
    private MinioClient minioClient;

    @Value("${minio.bucket-name}")
    private String bucketName;

    public String uploadFile(MultipartFile file) throws Exception {
      String fileName = file.getOriginalFilename();
      InputStream inputStream = file.getInputStream();
      minioClient.putObject(
            PutObjectArgs.builder().bucket(bucketName).object(fileName).stream(
                inputStream, inputStream.available(), -1)
                .contentType(file.getContentType())
                .build());
      return fileName;
    }

    public InputStream downloadFile(String fileName) throws Exception {
      return minioClient.getObject(
            GetObjectArgs.builder()
                         .bucket(bucketName)
                         .object(fileName)
                         .build());
    }
}

3.3 控制器类

最后,创建一个控制器类,提供文件上传和下载的接口:

package com.example.demo.controller;

import com.example.demo.service.MinioService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;

@RestController
@RequestMapping("/files")
public class MinioController {

    @Autowired
    private MinioService minioService;

    @PostMapping("/upload")
    public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) {
      try {
            String fileName = minioService.uploadFile(file);
            return ResponseEntity.ok(fileName);
      } catch (Exception e) {
            return ResponseEntity.status(500).body("Error uploading file: " + e.getMessage());
      }
    }

    @GetMapping("/download/{fileName}")
    public ResponseEntity<InputStreamResource> downloadFile(@PathVariable String fileName) {
      try {
            InputStream inputStream = minioService.downloadFile(fileName);
            return ResponseEntity.ok()
                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileName + "\"")
                .contentType(MediaType.APPLICATION_OCTET_STREAM)
                .body(new InputStreamResource(inputStream));
      } catch (Exception e) {
            return ResponseEntity.status(500).body(null);
      }
    }
}

4. 结论

通过以上步骤,我们成功地整合了Spring Boot和Minio,实现了文件的上传和下载功能。这种组合不仅简单高效,而且非常适合现代Web应用的开发需求。希望本文对你有所帮助,让你在项目中能够更轻松地实现文件存储功能。




------------------------------------------------------------------------------------------------------------------------------------------
========御 坂 主 机========
>> VPS主机 服务器 前沿资讯 行业发布 技术杂谈 <<
>> 推广/合作/找我玩TG号 : @Misaka_Offical <<
-------------------------------------------------------------------------------------------------------------------------------------------
页: [1]
查看完整版本: Spring Boot轻松整合Minio实现文件上传下载功能