SpringBoot整合MinIO实现文件上传的方法详解

SpringBoot整合MinIO实现文件上传的方法详解

简介

MinIO是一款开源的分布式对象存储服务,提供了一个Amazon S3兼容的API,可以轻松地在分布式系统中存储海量的数据。

本文将介绍如何在SpringBoot项目中使用MinIO进行文件上传,主要包括以下几个步骤:

  • 引入依赖
  • 配置MinIO连接信息
  • 编写上传文件的Controller
  • 测试上传文件功能

引入依赖

首先,在项目的pom.xml文件中引入MinIO的依赖:

<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>RELEASE.2021-10-01T01-38-11Z</version>
</dependency>

配置MinIO连接信息

在SpringBoot项目中,可以将MinIO连接信息配置在application.properties文件或application.yml文件中。以下是application.yml文件的配置示例:

minio:
  url: http://localhost:9000
  access-key: minioadmin
  secret-key: minioadmin
  bucket-name: test-bucket

编写上传文件的Controller

在SpringBoot中,可以使用MultipartFile类型接收上传的文件。编写上传文件的Controller如下:

@RestController
public class UploadController {

    @Autowired
    private MinioClient minioClient;

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

    @PostMapping("/upload")
    public String uploadFile(@RequestParam("file") MultipartFile file) throws Exception {
        if (file.isEmpty()) {
            return "上传失败,请选择文件";
        }
        InputStream inputStream = file.getInputStream();
        String originalFileName = file.getOriginalFilename();
        String contentType = file.getContentType();
        String objectName = UUID.randomUUID().toString() + originalFileName.substring(originalFileName.lastIndexOf("."));
        ObjectWriteResponse response = minioClient.putObject(PutObjectArgs.builder()
                .bucket(bucketName)
                .object(objectName)
                .contentType(contentType)
                .stream(inputStream, inputStream.available(), -1)
                .build());
        return "上传成功,文件访问地址:" + minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
                .method(Method.GET)
                .bucket(bucketName)
                .object(objectName)
                .expiry(1, TimeUnit.HOURS)
                .build());
    }

}

测试上传文件功能

在完成以上步骤后,可以通过Postman等工具进行文件上传测试。以下是一个测试示例:

  1. 使用POST请求访问http://localhost:8080/upload
  2. 在Body中选择form-data格式,设置Key为file,选择一个待上传的文件
  3. 发送请求,等待返回结果。如果上传成功,响应结果中会包含文件的访问地址。

示例说明

以下是使用以上代码实现文件上传的两个示例:

示例1:上传文件并将访问地址保存到数据库

@Service
public class FileServiceImpl implements FileService {

    @Autowired
    private MinioClient minioClient;

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

    @Autowired
    private FileRepository fileRepository;

    @Override
    public String uploadFile(MultipartFile file) throws Exception {
        if (file.isEmpty()) {
            throw new RuntimeException("上传失败,请选择文件");
        }
        InputStream inputStream = file.getInputStream();
        String originalFileName = file.getOriginalFilename();
        String contentType = file.getContentType();
        String objectName = UUID.randomUUID().toString() + originalFileName.substring(originalFileName.lastIndexOf("."));
        ObjectWriteResponse response = minioClient.putObject(PutObjectArgs.builder()
                .bucket(bucketName)
                .object(objectName)
                .contentType(contentType)
                .stream(inputStream, inputStream.available(), -1)
                .build());
        String fileUrl = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
                .method(Method.GET)
                .bucket(bucketName)
                .object(objectName)
                .expiry(1, TimeUnit.HOURS)
                .build());
        FileEntity fileEntity = new FileEntity();
        fileEntity.setName(originalFileName);
        fileEntity.setObjectUrl(fileUrl);
        fileRepository.save(fileEntity);
        return fileUrl;
    }

}

示例2:通过MinIO的Java SDK实现文件上传

public class MinioFileUploader {

    private static final String MINIO_URL = "http://localhost:9000";
    private static final String ACCESS_KEY = "minioadmin";
    private static final String SECRET_KEY = "minioadmin";
    private static final String BUCKET_NAME = "test-bucket";

    public static void main(String[] args) throws Exception {
        MinioClient minioClient = MinioClient.builder()
                .endpoint(MINIO_URL)
                .credentials(ACCESS_KEY, SECRET_KEY)
                .build();

        File file = new File("E:/example.txt");
        InputStream inputStream = new FileInputStream(file);
        String contentType = Files.probeContentType(file.toPath());
        String objectName = UUID.randomUUID().toString() + file.getName().substring(file.getName().lastIndexOf("."));
        System.out.println("上传的文件名:" + file.getName());
        System.out.println("文件保存到MinIO的名称:" + objectName);
        ObjectWriteResponse response = minioClient.putObject(PutObjectArgs.builder()
                .bucket(BUCKET_NAME)
                .object(objectName)
                .contentType(contentType)
                .stream(inputStream, inputStream.available(), -1)
                .build());
        System.out.println("文件已上传,访问地址为:" + minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
                .method(Method.GET)
                .bucket(BUCKET_NAME)
                .object(objectName)
                .expiry(1, TimeUnit.HOURS)
                .build()));
    }

}

以上是SpringBoot整合MinIO实现文件上传的方法详解,希望能对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot整合MinIO实现文件上传的方法详解 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • Win10 Store 允许批量购买应用和提供私人区域

    Win10 Store 允许批量购买应用和提供私人区域攻略 背景介绍 Win10 Store 是 Windows 10 操作系统中内置的应用商店,它提供了丰富的应用程序和游戏供用户下载和使用。随着企业用户的增多,Win10 Store 不仅提供了开发者开发应用程序的平台,也提供了企业管理应用程序的平台。本文主要介绍 Win10 Store 的批量购买和私人区…

    Azure 2023年5月25日
    00
  • 原生JS实现滑动按钮效果

    实现滑动按钮效果,可以使用原生JavaScript实现。下面是完整的攻略: 第一步:HTML结构搭建 首先,需要在HTML文件中创建一个div容器元素,用于包裹整个滑动按钮。基本结构如下: <div class="slider-container"> <div class="slider-button&quot…

    Azure 2023年5月26日
    00
  • Win10非安全累积更新补丁KB4541331修复了升级期间的蓝屏错误(附下载)

    Win10非安全累积更新补丁KB4541331修复了升级期间的蓝屏错误(附下载) 最近有Win10用户在升级系统时遇到了蓝屏错误的问题。为了解决这个问题,微软发布了非安全累积更新补丁KB4541331。本文将详细介绍这个补丁的下载、安装及其修复蓝屏错误的过程。 下载补丁 首先我们需要下载补丁。我们可以通过以下两种方式来下载: 微软官网下载: 在这里下载KB4…

    Azure 2023年5月25日
    00
  • VS2012发布ASP.NET网站到本地IIS的方法

    下面为您详细讲解“VS2012发布ASP.NET网站到本地IIS的方法”的完整攻略。 第一步:创建ASP.NET网站 首先,在VS2012中创建一个ASP.NET网站,选择菜单“文件”->“新建”->“网站”,在弹出的“新建网站”对话框中,选择“ASP.NET Web 站点”模板,然后选择一个合适的位置并设置站点名称,最后单击“确认”按钮即可创建…

    Azure 2023年5月25日
    00
  • Win10版本1909Build18363.997累积更新补丁KB4559004正式推送

    关于“Win10版本1909Build18363.997累积更新补丁KB4559004正式推送”的完整攻略,包含以下内容: 1. 下载适用于你的系统的更新补丁 首先需要确认你的系统版本,可以通过打开“设置”-“系统”-“关于”进行查看。然后去微软官网下载适用于你的系统的更新补丁:- Win10版本1909及以上系统:KB4559004- Win10版本190…

    Azure 2023年5月25日
    00
  • 微软公布win10开发中心12月更新详情

    微软公布 Win10 开发中心 12 月更新详情 简介 微软对 Win10 开发中心进行了 12 月更新,本文将针对此次更新进行详细讲解。 固定错误 此次更新过程中,微软对 Win10 开发中心进行了固定错误的优化。主要包括以下内容: 修复了打开某些应用时崩溃的错误。 修复了部分应用崩溃或无法启动的问题。 解决了一些开发者反映的安装问题。 针对以上问题,我们…

    Azure 2023年5月25日
    00
  • Windows 11今日正式推送:四大变化值得你拥有

    Windows 11今日正式推送:四大变化值得你拥有 Windows 11是微软推出的最新版Windows操作系统,相比Windows 10,Windows 11在外观和功能上均有显著改进。以下是四大变化值得你拥有的详细攻略。 1. 更加简洁的界面设计 Windows 11抛弃了Windows 10繁琐的界面设计,采用更加简洁的设计风格。任务栏位于屏幕下方,…

    Azure 2023年5月26日
    00
  • Win11 21H2 正式版 Build 22000.1696发布(附KB5023698更新内容汇总)

    Win11 21H2 正式版 Build 22000.1696发布(附KB5023698更新内容汇总) 前言 Win11 21H2 正式版 Build 22000.1696已经发布,本文将为你提供完整的更新攻略,以及相关的 KB5023698 更新内容汇总,让你更好的了解 Win11 21H2 的升级及优化内容,帮助你安心升级 Win11 21H2版本。 更…

    Azure 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部