Skip to content

项目中常见的功能是需要将数据文件(比如Excel,csv)上传到服务器端进行处理,亦或是将服务器端的数据以某种文件形式(比如excel,pdf,csv,word)下载到客户端。本文主要介绍基于SpringBoot的对常规文件的上传和下载,以及常见的问题等。@anarkh

  • ▶SpringBoot集成文件 - 基础的文件上传和下载
  • 知识准备
  • 哪些场景需要文件上传和下载
  • 实现案例
  • Pom依赖
  • 文件上传
  • 文件下载
  • 进一步理解
  • SpringBoot文件上传大小参数?
  • 多个文件上传?
  • 示例源码
  • 参考文章

知识准备

需要理解文件上传和下载的常见场景和技术手段。@anarkh

哪些场景需要文件上传和下载

项目中常见的功能是需要将数据文件(比如Excel,csv)上传到服务器端进行处理,亦或是将服务器端的数据以某种文件形式(比如excel,pdf,csv,word)下载到客户端。

实现案例

本例子主要展示文件的上传和文件的下载。

Pom依赖

引入spring-boot-starter-web即可

xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

文件上传

上传一个文件,并保存到本地文件夹中

java
@PostMapping("/upload")
public ResponseResult&lt;String&gt; upload(@RequestParam(value = "file", required = true) MultipartFile file) {
    try {
        
        String uploadPath = "/Users/anarkh/uploadFile"; 
        File uploadDir = new File(uploadPath);
        if (!uploadDir.exists()) {
            uploadDir.mkdir();
        }
        log.info(uploadDir.getAbsolutePath());

        
        File localFile = new File(uploadPath + File.separator + file.getOriginalFilename());

        
        file.transferTo(localFile);
    } catch (Exception e) {
        e.printStackTrace();
        return ResponseResult.fail(e.getMessage());
    }
    return ResponseResult.success();
}

通过postman,模拟上传的请求

上传文件结果:

文件下载

从本地文件夹中读取文件,并通过http下载

java
@GetMapping("/download")
public void download(HttpServletResponse response) {
    response.reset();
    response.setContentType("application/octet-stream");
    response.setHeader("Content-disposition",
            "attachment;filename=file_" + System.currentTimeMillis() + ".hprof");

    
    File file = new File("/Users/anarkh/anarkh_heap_dump_test.hprof"); 
    try (FileInputStream inputStream = new FileInputStream(file);) { 
        byte[] b = new byte[1024];
        int len;
        while ((len = inputStream.read(b)) > 0) {
            response.getOutputStream().write(b, 0, len);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

下载文件

注:

如果使用postman下载文件,默认的response大小是50MB,下载大于50MB的文件需要在这里自行设置。

进一步理解

通过如下几个问题进一步理解。

SpringBoot文件上传大小参数?

SpringBoot对上传的文件大小有限制,默认的最大每个文件配置最大为1MB,默认多个文件上传(上传目标文件夹)总大小是10MB。

yaml
spring:
  servlet:
    multipart:
      max-file-size: 1024MB 
      max-request-size: 10240MB

更多其它的参数可以参看MultipartProperties类

java
@ConfigurationProperties(prefix = "spring.servlet.multipart", ignoreUnknownFields = false)
public class MultipartProperties {

	
	private boolean enabled = true;

	
	private String location;

	
	private DataSize maxFileSize = DataSize.ofMegabytes(1);

	
	private DataSize maxRequestSize = DataSize.ofMegabytes(10);

	
	private DataSize fileSizeThreshold = DataSize.ofBytes(0);

	
	private boolean resolveLazily = false;

}

多个文件上传?

Spring支持接收多个文件的,只需要用MultipartFile接收即可

java
@PostMapping("/upload")
public ResponseResult&lt;String&gt; upload(MultipartFile[] files) {

}

示例源码

https://github.com/realanarkh/tech-anarkh-spring-demos

参考文章

https://www.jianshu.com/p/95469ecfbb62