SpringBoot结合Minio实现文件切片极速上传

简介: 【10月更文挑战第21天】

在现代Web应用中,文件上传是一个常见的功能。随着文件大小的增加,传统的单次上传方式变得不再高效。通过文件切片上传技术,可以显著提高大文件上传的效率和稳定性。本文将介绍如何使用SpringBoot和Minio实现文件切片上传,提供一个高效、可靠的文件上传解决方案。

Minio简介

Minio是一个高性能的对象存储服务,兼容Amazon S3 API。它提供了简单易用的API,可以方便地与SpringBoot集成,实现文件的存储和管理。

文件切片上传的原理

文件切片上传是将大文件分割成多个小块(切片),然后逐个上传到服务器。服务器接收到所有切片后,再将它们合并成完整的文件。这种方式可以有效地提高上传速度,减少上传失败的风险。

实现步骤

1. 环境准备

首先,确保你已经安装并配置好Minio服务器,并且能够正常访问。然后,在SpringBoot项目中添加Minio的依赖。

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

2. 配置Minio

在SpringBoot的配置文件中,添加Minio的相关配置。

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

3. 编写文件切片上传的Controller

创建一个Controller类,处理文件切片的上传请求。

@RestController
@RequestMapping("/upload")
public class FileUploadController {
   

    @Autowired
    private MinioClient minioClient;

    @PostMapping("/chunk")
    public ResponseEntity<String> uploadChunk(@RequestParam("file") MultipartFile file,
                                              @RequestParam("chunkIndex") int chunkIndex,
                                              @RequestParam("totalChunks") int totalChunks,
                                              @RequestParam("fileName") String fileName) {
   
        try {
   
            String chunkFileName = fileName + "_" + chunkIndex;
            minioClient.putObject(PutObjectArgs.builder()
                    .bucket("mybucket")
                    .object(chunkFileName)
                    .stream(file.getInputStream(), file.getSize(), -1)
                    .contentType(file.getContentType())
                    .build());

            return ResponseEntity.ok("Chunk uploaded successfully");
        } catch (Exception e) {
   
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Failed to upload chunk");
        }
    }

    @PostMapping("/merge")
    public ResponseEntity<String> mergeChunks(@RequestParam("fileName") String fileName,
                                              @RequestParam("totalChunks") int totalChunks) {
   
        try {
   
            String mergedFileName = fileName + "_merged";
            for (int i = 0; i < totalChunks; i++) {
   
                String chunkFileName = fileName + "_" + i;
                InputStream chunkStream = minioClient.getObject(GetObjectArgs.builder()
                        .bucket("mybucket")
                        .object(chunkFileName)
                        .build());

                minioClient.putObject(PutObjectArgs.builder()
                        .bucket("mybucket")
                        .object(mergedFileName)
                        .stream(chunkStream, chunkStream.available(), -1)
                        .build());
            }

            return ResponseEntity.ok("File merged successfully");
        } catch (Exception e) {
   
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Failed to merge chunks");
        }
    }
}

4. 前端实现

在前端实现文件切片上传的逻辑。可以使用JavaScript将文件分割成多个小块,并逐个上传到服务器。

async function uploadFile(file) {
   
    const chunkSize = 5 * 1024 * 1024; // 5MB
    const totalChunks = Math.ceil(file.size / chunkSize);

    for (let i = 0; i < totalChunks; i++) {
   
        const chunk = file.slice(i * chunkSize, (i + 1) * chunkSize);
        const formData = new FormData();
        formData.append("file", chunk);
        formData.append("chunkIndex", i);
        formData.append("totalChunks", totalChunks);
        formData.append("fileName", file.name);

        await fetch("/upload/chunk", {
   
            method: "POST",
            body: formData
        });
    }

    await fetch("/upload/merge", {
   
        method: "POST",
        body: JSON.stringify({
   
            fileName: file.name,
            totalChunks: totalChunks
        }),
        headers: {
   
            "Content-Type": "application/json"
        }
    });
}

结论

通过SpringBoot和Minio的结合,可以实现高效的文件切片上传。文件切片上传不仅提高了上传速度,还减少了上传失败的风险。掌握这种技术,可以为你的Web应用提供更好的用户体验和更高的可靠性。希望本文的分享能帮助你在实际项目中实现文件切片上传。

目录
相关文章
|
XML Java Maven
springboot-多环境配置文件
本文介绍了如何创建开发和生产环境的配置文件,并在IDEA和Maven中进行配置。开发环境中,通过设置profile为`dev`来指定配置文件;生产环境中,使用Maven命令参数`-Pprod`打包并指定配置文件。公共配置可放在`application.yml`中统一管理。日志配置需确保`logback-spring.xml`中的profile正确,以保证日志正常输出。
1016 4
springboot-多环境配置文件
|
存储 前端开发 Java
Springboot静态资源映射及文件映射
在Spring Boot项目中,为了解决前端访问后端存储的图片问题,起初尝试通过静态资源映射实现,但发现这种方式仅能访问打包时已存在的文件。对于动态上传的图片(如头像),需采用资源映射配置,将特定路径映射到服务器上的文件夹,确保新上传的图片能即时访问。例如,通过`addResourceHandler(&quot;/img/**&quot;).addResourceLocations(&quot;file:E:\\myProject\\forum_server\\&quot;)`配置,使前端可通过URL直接访问图片。
813 0
Springboot静态资源映射及文件映射
|
存储 Java 文件存储
Spring Boot 3 整合 Minio 实现文件存储
本文介绍了如何使用 Spring Boot 3 整合 MinIO 实现文件存储服务。MinIO 是一款高性能的对象存储服务器,适合大规模数据存储与分析,支持多种部署环境且文档完备、开源免费。从 MinIO 的快速安装、配置文件公开访问,到 Spring Boot 中集成 MinIO 客户端的步骤,包括创建用户访问密钥、引入依赖包、添加配置信息、编写 MinIO 客户端配置类及上传和预览文件的服务代码。最后通过 Apifox 进行文件上传测试,并验证文件是否成功存储及预览功能是否正常。关注公众号“Harry技术”,回复 minio 获取源码地址。
1218 76
|
存储 Java 文件存储
🗄️Spring Boot 3 整合 MinIO 实现分布式文件存储
本文介绍了如何基于Spring Boot 3和MinIO实现分布式文件存储。随着应用规模扩大,传统的单机文件存储方案难以应对大规模数据和高并发访问,分布式文件存储系统成为更好的选择。文章详细讲解了MinIO的安装、配置及与Spring Boot的整合步骤,包括Docker部署、MinIO控制台操作、Spring Boot项目中的依赖引入、配置类编写及工具类封装等内容。最后通过一个上传头像的接口示例展示了具体的开发和测试过程,强调了将API操作封装成通用工具类以提高代码复用性和可维护性的重要性。
2513 7
🗄️Spring Boot 3 整合 MinIO 实现分布式文件存储
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
10月前
|
存储 Java Linux
SpringBoot × MinIO 极速开发指南:对象存储服务高可用实战
生成临时访问URL接口和文件预览其实是同一个方法,只是文件预览内定了七天访问,而这个方法可以自行制定,单位是秒。方法,所以返回的是地址信息,但是可以通过dubug看到Bucket中的属性,确实是当前所有桶信息。配置类中奖MinIOClient客户端注入到Springboot中。MinIO集群的在Linux上的部署可以参考:​​​​​​​。Nginx代理MinIO集群可以参考:​​​​​​​。从Bucket源码可以看出,并没有实现。
966 0
|
XML Java API
Spring Boot集成MinIO
本文介绍了如何在Spring Boot项目中集成MinIO,一个高性能的分布式对象存储服务。主要步骤包括:引入MinIO依赖、配置MinIO属性、创建MinIO配置类和服务类、使用服务类实现文件上传和下载功能,以及运行应用进行测试。通过这些步骤,可以轻松地在项目中使用MinIO的对象存储功能。
1994 5
|
网络协议 Java
springboot配置hosts文件
springboot配置hosts文件
279 11
|
存储 JavaScript NoSQL
SpringBoot2 整合MinIO中间件,实现文件便捷管理
MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。
836 68
SpringBoot2 整合MinIO中间件,实现文件便捷管理
|
5月前
|
JavaScript Java 关系型数据库
基于springboot的项目管理系统
本文探讨项目管理系统在现代企业中的应用与实现,分析其研究背景、意义及现状,阐述基于SSM、Java、MySQL和Vue等技术构建系统的关键方法,展现其在提升管理效率、协同水平与风险管控方面的价值。