首页 > 其他分享 >Spring boot 处理大文件上传完整代码

Spring boot 处理大文件上传完整代码

时间:2023-09-28 18:56:08浏览次数:35  
标签:文件 Spring boot springframework org import 上传

这篇文章主要介绍了Spring boot 处理大文件上传,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下  

在Web上处理大文件上传时,可以使用以下方法来优化和处理大文件的上传:

1.前端处理:

  • 在前端使用合适的文件上传库或组件,例如Dropzone.jsFine Uploader等,它们提供了更好的用户体验和可靠的上传功能。
  • 使用分块上传(Chunked Upload)技术,将大文件拆分成较小的块进行上传,以便提高上传的可靠性和恢复能力。

2.服务器端处理:

  • 使用流式处理来逐块读取和保存上传的文件,而不是将整个文件加载到内存中。
  • 配置合适的请求超时时间和连接超时时间,以便处理较长时间的上传操作。
  • 使用临时文件或缓冲区来处理文件上传,以减少内存消耗。
  • 实现文件分块上传和断点续传功能,以便在上传过程中发生中断或失败时能够恢复上传进度。

完整代码:

当处理大文件上传时,可以使用Spring Boot来实现Web服务。下面是一个示例代码,演示如何使用Spring Boot处理大文件上传:

1. 创建Spring Boot项目:

   - 使用Spring Initializr(https://start.spring.io/)创建一个新的Spring Boot项目。 

- 选择所需的依赖,例如Spring Web、Spring Boot DevTools。

2. 编写控制器(Controller):

import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.util.StreamUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@Controller
@RequestMapping("/upload")
public class FileUploadController {
@Value("${upload.directory}")
private String uploadDirectory;
@PostMapping
public ResponseEntity<String> uploadFile(@RequestPart("file") MultipartFile file) {
try (InputStream inputStream = file.getInputStream()) {
// 获取上传文件的原始文件名
String fileName = file.getOriginalFilename();
// 生成保存文件的路径
String filePath = uploadDirectory + File.separator + fileName;
// 创建保存文件的目录(如果不存在)
File directory = new File(uploadDirectory);
if (!directory.exists()) {
directory.mkdirs();
}
// 保存文件到指定路径
try (OutputStream outputStream = new FileOutputStream(filePath)) {
StreamUtils.copy(inputStream, outputStream);
}
// 文件保存成功
return ResponseEntity.status(HttpStatus.OK).body("File uploaded successfully!");
} catch (IOException e) {
e.printStackTrace();
// 文件保存失败
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("File upload failed!");
}
}
}

3. 配置上传文件的存储路径: 

   - 在`application.properties`或`application.yml`文件中,添加一个属性来指定上传文件的存储路径,例如:     ```properties     upload.directory=/path/to/upload/directory     ```

我使用@RequestPart注解代替了@RequestParam,以支持文件的流式处理。

通过MultipartFilegetInputStream()方法获取输入流,并使用StreamUtils.copy()方法将输入流复制到输出流中,实现了流式的文件上传和保存。这样可以避免将整个文件加载到内存中,而是通过边读取输入流、边写入输出流的方式来处理大文件。

这样的流式处理方式可以更好地处理大文件上传,并减少内存的使用。在使用这种方式时,可以处理非常大的文件而不会导致内存溢出。

4. 运行应用程序:   - 使用IDE工具(如IntelliJ IDEA)或命令行运行Spring Boot应用程序。

5. 测试文件上传:   - 使用HTTP客户端工具(如Postman)或表单提交一个文件到`/upload`接口,选择一个大文件进行上传。   - 可以查看指定的上传目录,确认文件是否被成功保存。

在这个示例中,我们创建了一个控制器`FileUploadController`,它处理POST请求并接收一个名为`file`的文件参数。在`uploadFile`方法中,我们获取上传文件的原始文件名,生成文件的保存路径,并将文件保存到指定路径。

你可以在`application.properties`或`application.yml`文件中设置`upload.directory`属性,来指定上传文件的存储路径。

这只是一个简单的示例,你可以根据具体的需求扩展和修改代码来满足你的业务要求。例如,你可以添加文件大小限制、文件类型验证、断点续传等功能。

到此这篇关于Spring boot 处理大文件上传的文章就介绍到这了

 

参考文章:http://blog.ncmem.com/wordpress/2023/09/28/spring-boot-%e5%a4%84%e7%90%86%e5%a4%a7%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0%e5%ae%8c%e6%95%b4%e4%bb%a3%e7%a0%81/

欢迎入群一起讨论

 

 

 

 

标签:文件,Spring,boot,springframework,org,import,上传
From: https://www.cnblogs.com/songsu/p/17736339.html

相关文章

  • Spring Boot 实现文件上传
    在实际项目中,文件上传是很多项目必不可少的一个功能。那么在SpringBoot项目中又是如何来实现文件上传功能的呢?一般来说,上传的文件可以保存到项目根目录下的某一文件夹中,但这样做显然是不太合适的。因此我们选择将文件上传到专门的文件服务器中。很多云计算厂商都提供文件存......
  • Spring Cloud智慧工地云服务平台源码 PC端+APP端+数据大屏源码 开箱即用
    智慧工地云服务平台源码 PC端+APP端+数据大屏全套源码 自主版权智慧工地利用移动互联、物联网、云计算、大数据等新一代信息技术,彻底改变传统施工现场各参建方的交互方式、工作方式和管理模式,为建设集团、施工企业、监理单位、设计单位、政府监管部门等提供一揽子工地现场管理信......
  • SpringBoot笔记
    1.原理SpringApplication这个类主要做了以下四件事情:1、推断应用的类型是普通的项目还是Web项目2、查找并加载所有可用初始化器,设置到initializers属性中3、找出所有的应用程序监听器,设置到listeners属性中4、推断并设置main方法的定义类,找到运行的主类run方法剖析2.......
  • Spring Boot实现文件上传的两种方式
    最近的一个小项目里使用到了文件上传、下载功能,今天我打算梳理一下文件上传所涉及的技术及实现。内容主要包括两部分,如何通过纯Servlet的形式进行文件上传、保存(不通过Spring框架);另一部分是如何在SpringWebMVC中进行文件上传。01-从HTTP协议角度分析文件上传HTTP协......
  • Spring Framework框架
    SpringFramework框架一、含义:简称为Spring,是一个开源的、综合性的Java应用程序开发框架。它提供了一系列的功能和特性,用于开发企业级的Java应用程序。二、主要模块支持IoC和AOP的容器IoC(InversionofControl,控制反转):一种设计原则1.含义:它指将对象的创建、依赖关系的管理......
  • SpringMVC 的执行流程
    具体流程如下所示:用户发送出请求到前端控制器DispatcherServlet。DispatcherServlet收到请求调用HandlerMapping(处理器映射器)。HandlerMapping找到具体的处理器(可查找xml配置或注解配置),生成处理器对象及处理器拦截器(如果有),再一起返回给DispatcherServlet。Dis......
  • Spring boot 处理大文件上传
    在Web上处理大文件上传时,可以使用以下方法来优化和处理大文件的上传:前端处理:在前端使用合适的文件上传库或组件,例如Dropzone.js、FineUploader等,它们提供了更好的用户体验和可靠的上传功能。使用分块上传(ChunkedUpload)技术,将大文件拆分成较小的块进行上传,以便提高上传的可靠性......
  • 最近正在集成SpringBoot与MyBatis-plus,体验感很好啊
    sqlCREATETABLE`class`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'编号',`name`varchar(30)DEFAULTNULLCOMMENT'班级名',`floor`int(3)DEFAULTNULLCOMMENT'楼层',`teacher_id`int(11)DEFAULTNULLCOMMENT'老师......
  • 实战指南,SpringBoot + Mybatis 如何对接多数据源
    本文分享自华为云社区 《实战指南,SpringBoot+Mybatis如何对接多数据源》,作者:战斧。在我们开发一些具有综合功能的项目时,往往会碰到一种情况,需要同时连接多个数据库,这个时候就需要用到多数据源的设计。而Spring与Myabtis其实做了多数据源的适配,只需少许改动即可对接多数据源。......
  • springcloud gateway 获取响应体进行加密操作,byte[]转换String乱码
    记录一下困扰一星期的问题!在全局过滤器中,获取响应体进行加密操作,在拿到byte[]之后转成String,控制台打印出来是乱码,编码也加了UTF-8还是报错。publicMono<Void>filter(ServerWebExchangeexchange,GatewayFilterChainchain){ServerHttpResponseoriginalResponse=ex......