springboot+minio 文件上传

前期准备

需要先安装minio文件服务器,请参考我上一篇文章

pom.xml 版本

本次使用的是springboot2.7.16 版本,
minio 版本是8.2.2

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.16</version>
        <relativePath/>
    </parent>


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

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.11</version>
        </dependency>

配置minio服务

minio.endpoint=**********
minio.accessKey=******
minio.secretKey=*******
minio.bucketName=shuangningzixun
# 单个文件上传的最大值
spring.servlet.mutipart.max-file-size=200MB
# 整个请求体上传的文件大小
spring.servlet.mutipart.max-request-size=500MB

其中endpoint 为本地安装的minio服务地址,形式为IP+端口
accessKey和secretKey为用户名密码
桶名称则是在minio服务上新增的桶名称。

minio配置类

package com.example.demo.config;

import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Autowired;
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.endpoint}")
    private String endpoint;

    /**
     * accessKey类似于用户ID,用于唯一标识你的账户
     */
    @Value("${minio.accessKey}")
    private String accessKey;

    /**
     * secretKey是你账户的密码
     */
    @Value("${minio.secretKey}")
    private String secretKey;

    /**
     * 默认存储桶
     */
    @Value("${minio.bucketName}")
    private String bucketName;

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

minio配置实体类

package com.example.demo.config;


import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@ConfigurationProperties(prefix="minio")
@Component
@Getter
@Setter
public class Minio {
    private String url;
    private String username;
    private String password;
    private String bucketName;

}

minio下载服务类

package com.example.demo.service;

import com.example.demo.config.Minio;
import io.minio.BucketExistsArgs;
import io.minio.MakeBucketArgs;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.UUID;

@Component
public class MinioService {

    @Autowired
    private MinioClient minioClient;

    @Autowired
    private Minio minio;

    public String uploadFile(MultipartFile file) throws IOException {
        //判断捅是否存在
        String url=null;
        try {
            boolean bucketExists = minioClient.bucketExists(BucketExistsArgs
                    .builder().bucket(minio.getBucketName()).build());
            if (!bucketExists){
                //如果不存在,就创建捅
                minioClient.makeBucket(MakeBucketArgs.builder().
                        bucket(minio.getBucketName()).build());
            }
            String yyyyMMdd = LocalDateTime.now().
                    format(DateTimeFormatter.ofPattern("yyyy-mm-dd"));
            String uuid = UUID.randomUUID().toString();
            String filename = yyyyMMdd +"/"+file.getOriginalFilename();
            //
            minioClient.putObject(PutObjectArgs.builder().
                    bucket(minio.getBucketName())
                    .object(uuid).stream(file.getInputStream(),file.getSize(),-1)
                    .contentType(file.getContentType()).build());
          url  = minio.getUrl()+"/"+minio.getBucketName()+"/"+filename;
            return url;
        } catch (Exception e) {

        }finally {
            file.getInputStream().close();
        }
        return url;
    }
}

minio 上传文件工具类

package com.example.demo.utils;

import io.minio.GetObjectArgs;
import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.InputStream;

@Component
public class MinioUtils {

    @Autowired
    private MinioClient minioClient;

    public InputStream getObject(String bucketName, String objectName) throws Exception {
        return minioClient.getObject(GetObjectArgs.builder()
                .bucket(bucketName).object(objectName).build());

    }
}

文件控制器

package com.example.demo.controller;

import com.example.demo.common.ApiResult;
import com.example.demo.config.Minio;
import com.example.demo.service.MinioService;
import com.example.demo.utils.MinioUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;

@RestController
@RequestMapping("/file")
@Slf4j
public class FileController {
    @Autowired
    private MinioService minioService;

    @Autowired
    private MinioUtils minioUtils;

    @Autowired
    private Minio minio;

    /**
     * 文件上传接口
     */
    @PostMapping("/upload")
    public ApiResult<Void> upload(@RequestParam("file")MultipartFile multipartFile) throws Exception{
        minioService.uploadFile(multipartFile);
       return null;
    }

    /**
     * 文件下载接口
     */
    @GetMapping("/download")
    public void  download(@RequestParam("fileName")String fileName,
                          HttpServletResponse response) {
        try {
            InputStream fileInputStream = minioUtils.getObject(minio.getBucketName(),fileName);
            response.setHeader("Content-Disposition","attachment;filename="+fileName);
            response.setContentType("application/force-download");
            response.setCharacterEncoding("UTF-8");
            IOUtils.copy(fileInputStream,response.getOutputStream());
        } catch (Exception e) {
           log.info("下载失败",e);
        }
    }
}

postman测试

在这里插入图片描述
可以在minio控制台查询到已经上传的文件。
到此一个简单的文件上传下载服务就算成功了

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现Spring BootMinio的大文件上传并解压的功能,可以按照以下步骤进行操作: 1. 首先,在Spring Boot项目的pom.xml文件中引入Minio的依赖。可以使用以下代码将Minio的依赖添加到项目中: ``` <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>8.2.1</version> </dependency> ``` 2. 然后,将大文件分片并上传到Minio对象存储服务。可以按照以下步骤进行操作: - 将要上传的大文件进行分片处理,可以使用文件分片算法将大文件分成多个小块。 - 将分片后的文件依次上传到Minio对象存储服务,并指定一个临时文件名。 3. 分片上传完成后,将所有分片合并为一个完整的文件。可以按照以下步骤进行操作: - 从Minio中读取所有分片文件的流。 - 将分片流写入到一个临时文件中,以便后续解压。 4. 解压临时文件。可以按照以下步骤进行操作: - 使用合适的解压库或工具,对临时文件进行解压。 - 解压后的文件可以按需求进行进一步处理,例如再次上传到Minio或其他存储系统。 综上所述,要实现Spring BootMinio的大文件上传并解压功能,需要将文件分片并上传到Minio,然后将分片合并为完整文件,最后解压文件。这样可以实现大文件的上传和解压操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Spring boot + minio 分片上传](https://blog.csdn.net/XIAOTONGZHU/article/details/130346735)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [SpringBoot 使用 Minio 进行文件存储](https://blog.csdn.net/qq_43692950/article/details/125961685)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Windows常用软件压缩包,后端Java适用于springboot 2.6.x等高版本](https://download.csdn.net/download/m0_55710969/85062866)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值