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日

相关文章

  • 最新Windows10教育版+家庭版激活秘钥推荐 附激活工具

    最新Windows10教育版+家庭版激活秘钥推荐 附激活工具 如果您购买了Windows 10教育版或家庭版,或者您正在使用未激活的Windows 10教育版或家庭版,您可以使用以下激活秘钥和激活工具。 激活秘钥 以下是Windows 10教育版和家庭版的激活秘钥: Windows 10教育版:YNMGQ-8RYV3-4PGQ3-C8XTP-7CFBY Wi…

    Azure 2023年5月25日
    00
  • 微软Build2015 五大看点总结与详述

    微软Build2015 五大看点总结与详述 微软Build2015是微软的年度开发者大会,这次大会主要讨论了未来的技术和发展方向。以下是本次大会的五大看点: 1. Windows 10 微软Windows 10是本次大会的重头戏。微软希望Windows 10能够成为一款“开放的平台”,支持多种设备,包括PC、平板、手机等。Windows 10的特点是拥有全新…

    Azure 2023年5月27日
    00
  • JS+canvas动态绘制饼图的方法示例

    关于“JS+canvas动态绘制饼图的方法示例”的攻略,我将分为以下几个部分进行详细讲解: 先决条件 canvas基础知识 绘制饼图的步骤 示例1:静态饼图 示例2:动态饼图 接下来,我将逐一为你解析。 1. 先决条件 在进行饼图绘制之前,我们需要了解一些前置技术,包括HTML、CSS和JavaScript。此外,我们还需要了解canvas的基础知识。如果你…

    Azure 2023年5月25日
    00
  • WindowsServer2022正式版发布:镜像发布下载

    Windows Server 2022 正式版发布:镜像发布下载 简介 Windows Server 2022 正式版已于2021年8月18日发布。本文将为大家提供 Windows Server 2022 正式版的镜像下载地址和安装步骤,帮助大家快速获得该版本的体验。 镜像下载 Windows Server 2022 正式版的镜像下载链接如下: 官网链接:h…

    Azure 2023年5月25日
    00
  • Win10版本1909 Build 18363.752改进修复内容汇总(附补丁下载)

    Win10版本1909 Build 18363.752改进修复内容汇总(附补丁下载) 概述 本文为Win10版本1909 Build 18363.752的改进修复内容汇总,同时提供了相应的补丁下载。本次Windows更新修复了多个漏洞以及改进了系统的稳定性和性能,建议用户尽快更新。 更新内容列表 解决了本地安全性权限问题。 解决了带 SIM 卡的 ARM 版…

    Azure 2023年5月25日
    00
  • 微软原版win10系统怎么激活 2021.3最新原版win10激活秘钥推荐 含激活工具

    微软原版win10系统激活攻略 概述 微软原版win10系统是Windows操作系统的最新版本,它提供了更先进的功能和更好的性能。对于很多用户来说,激活win10系统是必要的,否则将无法使用一些重要的功能。本文将为大家提供2021年3月最新的win10激活秘钥推荐,并且分享一些激活工具,让大家快速轻松的完成win10系统的激活。 详细步骤 步骤一:下载Win…

    Azure 2023年5月25日
    00
  • 微软Win10新品发布会会议日程安排:Build2016应用免费下载

    微软Win10新品发布会会议日程安排:Build2016应用免费下载攻略 背景介绍 微软(Microsoft)公司是一家全球知名的软件公司。它的操作系统Windows,全球的PC用户占有率高达90%以上。近年来,微软大力推广云计算、人工智能等新兴领域,并且不断更新、升级Win10操作系统,推出各种新的应用程序,以满足用户的需求。 Build2016会议介绍 …

    Azure 2023年5月25日
    00
  • 手把手教你做超酷的条形码效果

    手把手教你做超酷的条形码效果 在本文中,我们将介绍如何使用HTML/CSS和JavaScript创建超酷的条形码效果。这个效果不仅可以增加网站的交互性,而且还可以吸引用户的注意力。本文将一步步介绍如何制作这个效果。 1. 准备工作 在开始之前,我们需要准备一些文件和工具: 一个HTML文件用于放置条形码效果和相关代码; 一个CSS文件用于设置样式; 一个Ja…

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