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日

相关文章

  • Android 颜色大全color.xml文件使用方法

    下面我将详细讲解”Android 颜色大全color.xml文件使用方法”的完整攻略。 1. 什么是color.xml文件? color.xml文件是Android工程中用来进行颜色资源管理的文件。在这个文件中,我们可以定义和管理所有应用中需要用到的颜色资源,包括不限于文本颜色、背景颜色、进度条颜色等等。 2. color.xml文件的使用方法 2.1 定义…

    Azure 2023年5月25日
    00
  • syncovery pro Enterprise 8企业破解版安装教程(附注册码)

    Syncovery Pro Enterprise 8企业破解版安装教程 Syncovery Pro Enterprise 8是一个功能强大的同步备份工具,可以帮助用户快速备份和同步文件,易于使用和操作。然而,这款软件需要购买才能正常使用,如需使用破解版则需要按照以下安装教程进行。 下载软件安装包 首先到可信的第三方软件下载网站下载Syncovery Pro …

    Azure 2023年5月25日
    00
  • Win11 Build 22000.466预览版更新补丁KB5008353(附更新修复内容汇总)

    Win11 Build 22000.466预览版更新补丁KB5008353攻略 本篇攻略将详细讲解Win11 Build 22000.466预览版更新补丁KB5008353的安装方式及更新修复内容汇总。 准备工作 在开始安装更新之前,请确认以下几点: 确认当前系统版本为Win11 Build 22000.466; 关闭所有正在运行的程序; 备份重要数据。 下…

    Azure 2023年5月25日
    00
  • Win11 Build 22000.282 Beta/Release 预览版更新补丁KB5006746推送(附更新内容大全)

    Win11 Build 22000.282 Beta/Release 预览版更新补丁KB5006746推送(附更新内容大全)攻略 更新内容大全 Win11 Build 22000.282 Beta/Release 预览版更新补丁KB5006746的更新内容大全包括以下内容: 修复了文件资源管理器在某些情况下崩溃的问题 修复了微软团队在 Teams 中的问题 …

    Azure 2023年5月25日
    00
  • angular8.5集成TinyMce5的使用和详细配置(推荐)

    下面是“angular8.5集成TinyMce5的使用和详细配置”的攻略: 1. 前置条件 在开始之前,你需要先确认以下几个前置条件: 已经安装了Angular CLI,并创建了一个Angular项目; 已经安装了jQuery和TinyMCE。 2. 安装TinyMCE 在项目中安装TinyMCE,有两种方式。 2.1 方式一:使用npm 可以使用npm来安…

    Azure 2023年5月25日
    00
  • Win11 KB5023778更新推送 22621.1485预览版更新内容汇总

    Win11 KB5023778更新推送 22621.1485预览版更新内容汇总 本文是对Win11 KB5023778更新推送 22621.1485预览版更新内容的详细介绍和使用攻略。本文将详尽解释更新的内容和更新后产生的影响,并提供一些示例以方便读者更好地理解和应用这些新功能。 更新内容概述 Win11 KB5023778更新推送 22621.1485预览…

    Azure 2023年5月25日
    00
  • LPL2015春季赛参赛队员介绍_2015LPL英雄联盟职业联赛队伍详解

    LPL2015春季赛参赛队员介绍 介绍 LPL2015春季赛是2015年的一场电子竞技比赛,比赛采用《英雄联盟》作为竞技游戏。本文将为大家详细介绍参赛队员及各队伍实力情况。 参赛队员 EDward Gaming EDward Gaming成立于2013年,成员有:Clearlove、Pawn、Deft、Mako、Meiko等。 OMG OMG成立于2012年…

    Azure 2023年5月25日
    00
  • Win10 1809累积更新17763.529更新补丁KB4497934(附补丁下载与更新汇总)

    Win10 1809累积更新17763.529更新补丁KB4497934 简介 本文介绍了Win10 1809累积更新17763.529更新补丁KB4497934的相关信息,包括更新时间,更新内容、更新方法、补丁下载及更新汇总等。 更新时间 Win10 1809累积更新17763.529更新补丁KB4497934发布于2019年5月15日,是Windows …

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