Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SpringBoot × MinIO 极速开发指南:对象存储服务高可用实战

SpringBoot × MinIO 极速开发指南:对象存储服务高可用实战

作者头像
摘星.
发布于 2025-05-20 06:17:29
发布于 2025-05-20 06:17:29
10900
代码可运行
举报
文章被收录于专栏:博客专享博客专享
运行总次数:0
代码可运行

SpringBoot Integrate MinIO

本章的知识网络:

1. MinIO 安装部署

MinIO的在Linux上的部署可以参考:MinIO在Linux上的安装与部署_minio linux部署-CSDN博客

MinIO集群的在Linux上的部署可以参考:MinIO在Linux上的集群安装与部署-CSDN博客

Nginx代理MinIO集群可以参考:Nginx代理MinIO集群-CSDN博客

2. SpringBoot 项目配置

2.1. 添加依赖

添加相应的pom.xml文件依赖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springdoc</groupId>
            <artifactId>springdoc-openapi-ui</artifactId>
            <version>1.6.14</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.minio</groupId>
            <artifactId>minio</artifactId>
            <version>8.5.6</version>
            <exclusions>
                <exclusion>
                    <groupId>com.squareup.okhttp3</groupId>
                    <artifactId>okhttp</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>4.11.0</version> <!-- 使用最新稳定版 -->
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.30</version>
        </dependency>
2.2. 配置文件

配置application.yml文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
minio:
  endpoint: http://192.168.33.205:9000 # Nginx 负载均衡器的地址
  access-key: gVqpDMoCHridNBp9wI1O # 访问密钥
  secret-key: H6E19mqETNxYFJ6PgSK1V6tgdWjeiqt8e6BMnkuV # 安全密钥
  bucketName: springboot-mino-test-bucket # 存储桶名称
# 文件上传大小限制
spring:
  servlet:
    multipart:
      enabled: true
      max-file-size: 100MB
      max-request-size: 100MB
2.3. 桶的数量配置

在项目开发中,使用 MinIO 桶的数量取决于具体的业务需求和技术架构设计,以下是不同场景的实践建议:

  1. 小型项目或简单业务在配置文件中配置一个桶即可,简单高效,维护成本低,但是灵活性差。
  2. 中大型项目或复杂业务需要权限控制、数据隔离和多租户情况时,可以再配置文件中预设高频使用的桶(例如用户头像、日志文件等),在接口中动态制定低频使用的桶(租户个人空间)

以下是部分示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
minio:
  buckets:
    user: app-user-data
    product: app-product-images
    log: app-system-logs
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
minio:
  buckets:
    dev: app-dev-bucket
    test: app-test-bucket
    prod: app-prod-bucket
2.4. 配置类

配置类中奖MinIOClient客户端注入到Springboot中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Configuration
@Getter
public class MinioConfig {

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

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

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

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

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

3. MinIO 核心功能实现

3.1. MinIO 工具类

MinIO工具类中包含了操作MinIO服务的核心方法:

  • 文件上传(支持自动重命名)
  • 文件下载(文件输入流和浏览器直接下载)
  • 文件删除
  • 获取桶中文件列表
  • 存储桶管理(增、删、是否存在、获取桶列表)
  • 生成临时访问链接
  • 图片预览
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * Minio对象存储操作工具类
 * 包含存储桶管理、文件操作、浏览器下载等完整功能
 */
@Component
public class MinioUtil {
    private final MinioClient minioClient;
    private final MinioConfig minioConfig;

    @Autowired
    public MinioUtil(MinioClient minioClient, MinioConfig minioConfig) {
        this.minioClient = minioClient;
        this.minioConfig = minioConfig;
    }

    /* 存储桶操作系列方法 */

    /**
     * 检查存储桶是否存在
     *
     * @param bucketName 存储桶名称
     * @return 是否存在
     * @throws Exception Minio操作异常
     */
    public boolean bucketExists(String bucketName) throws Exception {
        return minioClient.bucketExists(BucketExistsArgs.builder()
                .bucket(bucketName)
                .build());
    }

    /**
     * 创建新存储桶
     *
     * @param bucketName 存储桶名称
     * @return 是否创建成功
     * @throws Exception Minio操作异常
     */
    public boolean createBucket(String bucketName) throws Exception {
        if (!bucketExists(bucketName)) {
            minioClient.makeBucket(MakeBucketArgs.builder()
                    .bucket(bucketName)
                    .build());
            return true;
        }
        return false;
    }

    /**
     * 删除存储桶(存储桶必须为空)
     *
     * @param bucketName 存储桶名称
     * @throws Exception Minio操作异常
     */
    public void removeBucket(String bucketName) throws Exception {
        minioClient.removeBucket(RemoveBucketArgs.builder()
                .bucket(bucketName)
                .build());
    }

    /**
     * 获取全部存储桶列表
     *
     * @return 存储桶信息列表
     * @throws Exception Minio操作异常
     */
    public List<Bucket> listAllBuckets() throws Exception {
        return minioClient.listBuckets();
    }

    /* 文件操作系列方法 */

    /**
     * 上传文件到默认存储桶
     *
     * @param file       上传的文件对象
     * @param objectName 存储对象名称(包含路径)
     * @return 文件访问URL
     * @throws Exception Minio操作异常
     */
    public String uploadFile(MultipartFile file, String objectName) throws Exception {
        // 自动生成唯一文件名
        if (objectName == null || objectName.isEmpty()) {
            objectName = generateUniqueName(file.getOriginalFilename());
        }

        minioClient.putObject(PutObjectArgs.builder()
                .bucket(minioConfig.getBucketName())
                .object(objectName)
                .stream(file.getInputStream(), file.getSize(), -1)
                .contentType(file.getContentType())
                .build());

        return getFileUrl(objectName);
    }

    /**
     * 获取文件临时访问URL
     *
     * @param objectName 存储对象名称
     * @param expiry     有效期(单位:秒)
     * @return 临时访问URL
     * @throws Exception Minio操作异常
     */
    public String getPresignedUrl(String objectName, int expiry) throws Exception {
        return minioClient.getPresignedObjectUrl(
                GetPresignedObjectUrlArgs.builder()
                        .method(Method.GET)
                        .bucket(minioConfig.getBucketName())
                        .object(objectName)
                        .expiry(expiry, TimeUnit.SECONDS)
                        .build());
    }

    /**
     * 图片预览(生成7天有效的URL)
     *
     * @param objectName 存储对象名称
     * @return 预览URL
     * @throws Exception Minio操作异常
     */
    public String previewImage(String objectName) throws Exception {
        return minioClient.getPresignedObjectUrl(
                GetPresignedObjectUrlArgs.builder()
                        .method(Method.GET)
                        .bucket(minioConfig.getBucketName())
                        .object(objectName)
                        .expiry(7, TimeUnit.DAYS)
                        .build());
    }

    /**
     * 获取文件输入流
     *
     * @param objectName 存储对象名称
     * @return 文件流
     * @throws Exception Minio操作异常
     */
    public InputStream downloadFile(String objectName) throws Exception {
        return minioClient.getObject(GetObjectArgs.builder()
                .bucket(minioConfig.getBucketName())
                .object(objectName)
                .build());
    }

    /**
     * 直接下载文件到HttpServletResponse(浏览器下载)
     *
     * @param objectName 存储对象名称
     * @param response   HttpServletResponse
     * @throws Exception Minio操作异常或IO异常
     */
    public void downloadToResponse(String objectName, HttpServletResponse response) throws Exception {
        // 获取文件元数据
        StatObjectResponse stat = minioClient.statObject(StatObjectArgs.builder()
                .bucket(minioConfig.getBucketName())
                .object(objectName)
                .build());

        // 设置响应头
        response.setContentType(stat.contentType());
        response.setHeader("Content-Disposition",
                "attachment; filename=\"" + URLEncoder.encode(objectName, StandardCharsets.UTF_8.name()) + "\"");
        response.setContentLengthLong(stat.size());

        // 流式传输文件内容
        try (InputStream is = downloadFile(objectName);
             OutputStream os = response.getOutputStream()) {
            IOUtils.copy(is, os);
            os.flush();
        }
    }

    /**
     * 删除文件
     *
     * @param objectName 存储对象名称
     * @throws Exception Minio操作异常
     */
    public void deleteFile(String objectName) throws Exception {
        minioClient.removeObject(RemoveObjectArgs.builder()
                .bucket(minioConfig.getBucketName())
                .object(objectName)
                .build());
    }

    /**
     * 列出存储桶中的所有文件
     *
     * @param bucketName 存储桶名称
     * @return 文件信息列表
     * @throws Exception Minio操作异常
     */
    public List<String> listAllFiles(String bucketName) throws Exception {
        List<String> list = new ArrayList<>();
        for (Result<Item> result : minioClient.listObjects(
                ListObjectsArgs.builder().bucket(bucketName).build())) {
            list.add(result.get().objectName());
        }
        return list;
    }

    /**
     * 获取文件元数据
     *
     * @param objectName 存储对象名称
     * @return 文件元数据
     * @throws Exception Minio操作异常
     */
    public StatObjectResponse getObjectStat(String objectName) throws Exception {
        return minioClient.statObject(StatObjectArgs.builder()
                .bucket(minioConfig.getBucketName())
                .object(objectName)
                .build());
    }

    /**
     * 生成永久访问URL(需要存储桶设置为公开)
     *
     * @param objectName 存储对象名称
     * @return 直接访问URL
     */
    public String getPermanentUrl(String objectName) {
        return String.format("%s/%s/%s",
                minioConfig.getEndpoint(),
                minioConfig.getBucketName(),
                objectName);
    }

    /**
     * 验证文件类型白名单
     *
     * @param file         上传文件
     * @param allowedTypes 允许的类型列表
     * @throws IllegalArgumentException 文件类型不合法
     */
    public void validateFileType(MultipartFile file, List<String> allowedTypes) {
        String fileType = file.getContentType();
        if (!allowedTypes.contains(fileType)) {
            throw new IllegalArgumentException("不支持的文件类型: " + fileType);
        }
    }

    /* 辅助方法 */

    private String generateUniqueName(String originalFileName) {
        return UUID.randomUUID().toString().replace("-", "")
                + "_" + originalFileName;
    }

    private String getFileUrl(String objectName) throws Exception {
        return minioConfig.getEndpoint() + "/"
                + minioConfig.getBucketName() + "/" + objectName;
    }

    /* 扩展功能方法 */

    /**
     * 复制文件到新位置
     *
     * @param sourceBucket 源存储桶
     * @param sourceObject 源文件
     * @param destBucket   目标存储桶
     * @param destObject   目标文件
     * @throws Exception Minio操作异常
     */
    public void copyObject(String sourceBucket, String sourceObject,
                           String destBucket, String destObject) throws Exception {
        minioClient.copyObject(CopyObjectArgs.builder()
                .source(CopySource.builder()
                        .bucket(sourceBucket)
                        .object(sourceObject)
                        .build())
                .bucket(destBucket)
                .object(destObject)
                .build());
    }
}
3.2. MinIO 控制器

FileController在MinIO工具基础上实现了以下接口:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Tag(name = "文件管理接口")
@RestController
@RequestMapping("/minio")
public class MinioController {

    private final MinioUtil minioUtil;
    private final MinioConfig minioConfig;

    @Autowired
    public MinioController(MinioUtil minioUtil, MinioConfig minioConfig) {
        this.minioUtil = minioUtil;
        this.minioConfig = minioConfig;
    }

    @Operation(summary = "文件上传")
    @PostMapping("/upload")
    public R<String> uploadFile(@RequestParam("file") MultipartFile file,
                                @RequestParam(value = "objectName", required = false) String objectName) {
        try {
            if (file.isEmpty()) {
                return R.error(HttpStatus.BAD_REQUEST.value(), "上传文件不能为空");
            }
            String url = minioUtil.uploadFile(file, objectName);
            return R.success("上传成功", url);
        } catch (Exception e) {
            return R.error(HttpStatus.INTERNAL_SERVER_ERROR.value(), e.getMessage());
        }
    }

    @Operation(summary ="文件下载")
    @GetMapping("/download/{objectName}")
    public void downloadFile(@PathVariable String objectName, HttpServletResponse response) {
        try {
            minioUtil.downloadToResponse(objectName, response);
        } catch (Exception e) {
            response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
        }
    }

    @Operation(summary ="文件预览(7天有效期)")
    @GetMapping("/preview/{objectName}")
    public R<String> previewFile(@PathVariable String objectName) {
        try {
            String url = minioUtil.previewImage(objectName);
            return R.success("获取预览地址成功", url);
        } catch (Exception e) {
            return R.error(HttpStatus.INTERNAL_SERVER_ERROR.value(), e.getMessage());
        }
    }

    @Operation(summary ="删除文件")
    @DeleteMapping("/delete/{objectName}")
    public R<Void> deleteFile(@PathVariable String objectName) {
        try {
            minioUtil.deleteFile(objectName);
            return R.success("删除成功");
        } catch (Exception e) {
            return R.error(HttpStatus.INTERNAL_SERVER_ERROR.value(), e.getMessage());
        }
    }

    @Operation(summary ="获取文件列表")
    @GetMapping("/list")
    public R<List<String>> listFiles(@RequestParam(required = false) String bucketName) {
        try {
            String targetBucket = (bucketName != null && !bucketName.isEmpty())
                    ? bucketName : minioConfig.getBucketName();
            List<String> files = minioUtil.listAllFiles(targetBucket);
            return R.success("获取成功", files);
        } catch (Exception e) {
            return R.error(HttpStatus.INTERNAL_SERVER_ERROR.value(), e.getMessage());
        }
    }

    @Operation(summary ="生成临时访问URL")
    @GetMapping("/presigned-url")
    public R<String> getPresignedUrl(@RequestParam String objectName,
                                    @RequestParam(defaultValue = "3600") int expiry) {
        try {
            String url = minioUtil.getPresignedUrl(objectName, expiry);
            return R.success("生成成功", url);
        } catch (Exception e) {
            return R.error(HttpStatus.INTERNAL_SERVER_ERROR.value(), e.getMessage());
        }
    }

    @Operation(summary ="获取永久访问URL")
    @GetMapping("/permanent-url/{objectName}")
    public R<String> getPermanentUrl(@PathVariable String objectName) {
        try {
            String url = minioUtil.getPermanentUrl(objectName);
            return R.success("获取成功", url);
        } catch (Exception e) {
            return R.error(HttpStatus.INTERNAL_SERVER_ERROR.value(), e.getMessage());
        }
    }

    // 存储桶管理相关接口
    @Operation(summary ="创建存储桶")
    @PostMapping("/buckets/{bucketName}")
    public R<Void> createBucket(@PathVariable String bucketName) {
        try {
            boolean created = minioUtil.createBucket(bucketName);
            return created ? R.success("创建成功") : R.error(HttpStatus.INTERNAL_SERVER_ERROR.value(),"存储桶已存在");
        } catch (Exception e) {
            return R.error(HttpStatus.INTERNAL_SERVER_ERROR.value(), e.getMessage());
        }
    }

    @Operation(summary ="删除存储桶")
    @DeleteMapping("/buckets/{bucketName}")
    public R<Void> deleteBucket(@PathVariable String bucketName) {
        try {
            minioUtil.removeBucket(bucketName);
            return R.success("删除成功");
        } catch (Exception e) {
            return R.error(HttpStatus.INTERNAL_SERVER_ERROR.value(), e.getMessage());
        }
    }

    @Operation(summary ="获取所有存储桶")
    @GetMapping("/buckets")
    public R<List<io.minio.messages.Bucket>> listBuckets() {
        try {
            List<io.minio.messages.Bucket> buckets = minioUtil.listAllBuckets();
            return R.success("获取成功", buckets);
        } catch (Exception e) {
            return R.error(HttpStatus.INTERNAL_SERVER_ERROR.value(), e.getMessage());
        }
    }
}

4. 功能测试验证

下方提供了功能测试的图例,我将apipost的地址共享在这里,有需要测试的朋友可以自行测试:

Apipost-基于协作, 不止于API文档、调试、Mock、自动化测试

4.1. 程序启动

访问地址是127.0.0.1:8080

4.2. 文件上传接口验证

ApiPost验证文件上传:

验证文件确实上传成功:

验证返回的文件url:

4.3. 文件下载接口验证

ApiPost验证文件下载:

4.4. 文件预览(7天有效期)接口验证

ApiPost验证文件预览(7天有效期):

验证文件预览URL:

4.5. 文件删除接口验证

准备删除的文件

ApiPost验证文件删除:

准备删除的文件已经删除了

4.6. 获取文件列表接口验证

ApiPost验证获取文件列表:

4.7. 生成临时访问URL接口验证

生成临时访问URL接口和文件预览其实是同一个方法,只是文件预览内定了七天访问,而这个方法可以自行制定,单位是秒

ApiPost验证生成临时URL:

验证临时访问URL

4.8. 获取永久访问URL接口验证

ApiPost验证获取永久访问URL:

验证永久访问URL:

4.9. 创建存储桶接口验证

ApiPost验证创建存储桶:

验证桶确实创建成功:

再次调用返回桶已存在

4.10. 获取所有存储桶接口验证

ApiPost验证获取所有存储桶:

从Bucket源码可以看出,并没有实现toString()方法,所以返回的是地址信息,但是可以通过dubug看到Bucket中的属性,确实是当前所有桶信息

4.11. 删除存储桶接口验证

ApiPost验证删除存储桶:

桶已删除

再次调用返回该桶已不存在

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-04-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
springboot整合minio+vue实现大文件分片上传,断点续传(复制可用,包含minio工具类)
一只牛博
2025/05/31
1180
springboot整合minio+vue实现大文件分片上传,断点续传(复制可用,包含minio工具类)
🗄️Spring Boot 3 整合 MinIO 实现分布式文件存储
文件存储已成为一个做任何应用都不可回避的需求。传统的单机文件存储方案在面对大规模数据和高并发访问时往往力不从心,而分布式文件存储系统则提供了更好的解决方案。本篇文章我将基于Spring Boot 3 为大家讲解如何基于MinIO来实现分布式文件存储。
别惹CC
2025/03/05
4460
🗄️Spring Boot 3 整合 MinIO 实现分布式文件存储
SpringBoot整合Minio对象存储服务
MinIO 是一款高性能、分布式的对象存储系统. 它是一款软件产品, 可以100%的运行在标准硬件。即X86等低成本机器也能够很好的运行MinIO。 MinIO与传统的存储和其他的对象存储不同的是:它一开始就针对性能要求更高的私有云标准进行软件架构设计。因为MinIO一开始就只为对象存储而设计。所以他采用了更易用的方式进行设计,它能实现对象存储所需要的全部功能,在性能上也更加强劲,它不会为了更多的业务功能而妥协,失去MinIO的易用性、高效性。 这样的结果所带来的好处是:它能够更简单的实现局有弹性伸缩能力的
甄士隐
2022/01/27
2.1K0
SpringBoot整合Minio对象存储服务
Spring Boot 3 整合 minio 实现文件存储
就拿小型网站系统来说,一般情况下,会把文件存储服务和网站系统部署在同一台服务器上。这种做法在小成本资源投入方面确实具有一定优势。如果网站的访问量处于较低水平,这种方式基本不会引发什么问题。然而,随着网站访问量的逐步攀升,网站文件资源的读取操作变得越来越频繁。此时,单台服务器可能就无法承受如此大量的请求了,进而导致网站打不开或者出现系统异常等情况。
Harry技术
2025/01/13
2440
Spring Boot 3 整合 minio 实现文件存储
SpringBoot + Minio 实现文件切片极速上传技术(实战典藏版)
提示:请不要多个博客来回跳着看,此文章之详细绝无仅有,融合多家之长,如果遇见报错,请仔细捋一遍文章,不要忽略!我在写的时候因为许多文章不全面,来回跳遇见许多坑,希望大家可以避免,本文章中悉数做了标注提醒!!!
码猿技术专栏
2024/07/08
1.8K0
SpringBoot + Minio 实现文件切片极速上传技术(实战典藏版)
springboot集成minio,docker部署
知识浅谈
2023/09/25
3510
手把手教你SpringBoot轻松整合Minio实现文件上传下载
前面我们介绍了什么是分布式存储系统,介绍了什么是MinIO,最后如何使用MinIO构建分布式文件系统。那么怎么在实际的项目中使用MinIO呢?接下来就手把手教你如何在SpringBoot中轻松整合MinIO 。
章为忠学架构
2023/10/06
5.2K0
手把手教你SpringBoot轻松整合Minio实现文件上传下载
Spring Boot 工程集成 minio 对象存储
上一片博文里我们介绍了 minio 对象存储的部署,这篇博文 我们主要介绍下 基于minio和spring boot的工程开发
Freedom123
2024/03/29
1560
springboot整合minio
accessKey和secretKey需要根据启动的窗口上的值进行配置bucketName这个需要自己创建
java后端指南
2022/02/23
1.3K0
springboot整合minio
Spring Boot整合MinIO实现文件上传和下载
家人们啦!,上篇文章了,我们讲了如何使用docker-compose快速部署MinIO,在今天的文章中,我将向大家介绍如何将Spring Boot与MinIO进行无缝整合,以便高效地管理和操作文件存储。通过这个整合,你将能够轻松地在Spring Boot应用程序中实现文件的上传和下载等功能。让我们开始吧
修己xj
2023/08/25
1.1K0
Spring Boot整合MinIO实现文件上传和下载
Spring Boot集成MinIO
在Spring Boot项目中集成MinIO(一个高性能的分布式对象存储服务)是一个相对简单的过程。以下是一个详细的步骤指南,帮助你完成这个集成。
科技新语
2024/12/02
3070
Spring Boot集成MinIO
Springboot3 + Minio + 腾讯混元助手 做一个网盘(一)
Bucket 英文直译就是桶,就开发角度来说,一个用户有多个桶,每个桶存放不同类型的数据。这就像你的c盘放系统,D盘放学习资料,E盘放开发工程一样。当然也可以都放一个盘。
花花Binki
2023/09/21
8900
Springboot3 + Minio + 腾讯混元助手 做一个网盘(一)
写给大忙人看的 – Java中上传文件MinIO服务器(2)
上一篇 写给大忙人看的 – 搭建文件服务器 MinIO(一),我们已经成功地搭建了 MinIO 文件服务器,这一篇讲解在 Java 中如何上传文件至 MinIO
全栈程序员站长
2022/09/05
1.1K0
Spring Boot + MinIO 实现文件切片极速上传技术
在现代Web应用中,文件上传是一个常见的需求,尤其是对于大文件的上传,如视频、音频或大型文档。为了提高用户体验和系统性能,文件切片上传技术逐渐成为热门选择。本文将介绍如何使用Spring Boot和MinIO实现文件切片极速上传技术,通过将大文件分割成小片段并并行上传,显著提高文件上传速度。
IT_陈寒
2023/12/20
2.5K0
Spring Boot + MinIO 实现文件切片极速上传技术
Spring Boot + minio 实现高性能存储服务,So Easy~!
点击关注公众号,Java干货及时送达 什么是minio 引用官网: MinIO是根据GNU Affero通用公共许可证v3.0发布的高性能对象存储。它与Amazon S3云存储服务兼容。使用MinIO构建用于机器学习,分析和应用程序数据工作负载的高性能基础架构。 官网地址: https://min.io/ 文档地址: https://docs.min.io/ 一. 使用docker 搭建minio 服务。 GNU / Linux和macOS docker run -p 9000:9000 \   --na
Java技术栈
2022/09/07
1.9K0
Spring Boot + minio 实现高性能存储服务,So Easy~!
接入minio我来帮你做
​ hello,everyone。好久不见,相信大家日常开发工作中对于文件的存储,读取等都是有大大小小的需求的。在博主刚接触springboot的时候,比较喜欢把一些文件存储在linux的磁盘上,但是后面发现对于磁盘上的文件管理很麻烦。而且如果磁盘一旦损坏,那么存储在磁盘上的文件将会全部丢失。为了解决上面的需求与问题,本文将给大家带来分布式文件存储中间件-minio。
柏炎
2022/08/23
1.4K0
接入minio我来帮你做
SpringBoot 整合 Mini
这里把MinioClient注入到Bean中,后续使用MinioClient调用Minio的API。
阿珍
2024/10/28
1530
SpringBoot 整合 Mini
SpringBoot 搭建基于 minio 的高性能存储服务
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/03/04
2K0
MinIO对象存储
MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。
别团等shy哥发育
2023/03/30
7.5K0
MinIO对象存储
蘑菇博客如何集成Minio对象存储服务器
今天我们来讲讲蘑菇博客中的文件存储,蘑菇博客目前使用了本地文件存储,七牛云存储和Minio存储,下面是每种存储服务之间的优缺点,让我们一起来康康吧
陌溪
2021/04/09
1.6K0
蘑菇博客如何集成Minio对象存储服务器
推荐阅读
相关推荐
springboot整合minio+vue实现大文件分片上传,断点续传(复制可用,包含minio工具类)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验