32. 如何在Spring Boot中处理文件上传和下载?
大约 3 分钟
在Spring Boot中处理文件上传和下载是非常常见的需求。Spring Boot基于Spring MVC提供了对文件上传和下载的简便支持。下面我将详细介绍如何在Spring Boot中实现文件上传和下载功能。
1. 文件上传
1.1 配置文件上传大小限制
Spring Boot默认支持文件上传,但是可以通过配置文件来调整上传文件的大小限制。
在application.properties
或application.yml
中配置文件上传的最大大小和请求大小:
# application.properties
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
或者在application.yml
中:
# application.yml
spring:
servlet:
multipart:
max-file-size: 10MB
max-request-size: 10MB
1.2 创建文件上传的Controller
通过使用@RequestParam
注解来接收上传的文件,Spring会将上传的文件映射到MultipartFile
对象上。
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
@RestController
public class FileUploadController {
private static final String UPLOAD_DIR = "uploads/";
@PostMapping("/upload")
public String handleFileUpload(@RequestParam("file") MultipartFile file) {
if (file.isEmpty()) {
return "Please select a file to upload.";
}
try {
// 将文件保存到指定目录
byte[] bytes = file.getBytes();
Path path = Paths.get(UPLOAD_DIR + file.getOriginalFilename());
Files.write(path, bytes);
return "File uploaded successfully: " + file.getOriginalFilename();
} catch (IOException e) {
e.printStackTrace();
return "File upload failed.";
}
}
}
在这个示例中:
@PostMapping("/upload")
:定义了文件上传的URL路径。@RequestParam("file") MultipartFile file
:用于接收上传的文件。file.getOriginalFilename()
:获取上传文件的原始文件名。Files.write(path, bytes)
:将文件保存到服务器指定目录。
1.3 文件上传的HTML表单
你可以通过一个简单的HTML表单来测试文件上传功能:
<!DOCTYPE html>
<html>
<head>
<title>File Upload</title>
</head>
<body>
<h1>Upload a File</h1>
<form method="POST" action="/upload" enctype="multipart/form-data">
<input type="file" name="file" />
<button type="submit">Upload</button>
</form>
</body>
</html>
2. 文件下载
2.1 创建文件下载的Controller
文件下载通过ResponseEntity
来处理。ResponseEntity
允许你设置HTTP头和响应体。
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import java.nio.file.Path;
import java.nio.file.Paths;
@RestController
public class FileDownloadController {
private static final String UPLOAD_DIR = "uploads/";
@GetMapping("/download/{filename}")
public ResponseEntity<Resource> downloadFile(@PathVariable String filename) {
try {
Path filePath = Paths.get(UPLOAD_DIR).resolve(filename).normalize();
Resource resource = new UrlResource(filePath.toUri());
if (resource.exists()) {
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"")
.body(resource);
} else {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null);
}
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
}
}
}
在这个示例中:
@GetMapping("/download/{filename}")
:定义了文件下载的URL路径,使用路径参数来指定文件名。UrlResource
:用于将文件路径转换为Resource
对象,这个对象可以作为响应体返回。HttpHeaders.CONTENT_DISPOSITION
:用于指示浏览器以附件形式下载文件。
2.2 下载文件的请求
要下载文件,只需访问/download/{filename}
路径,例如,/download/sample.txt
。浏览器将提示用户下载文件。
3. 处理文件上传和下载的异常
在实际开发中,处理文件上传和下载时,可能会遇到各种异常情况。你可以通过@ControllerAdvice
或在Controller
中使用try-catch
来处理这些异常。
3.1 示例:处理文件上传的异常
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.http.HttpStatus;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
@RestControllerAdvice
public class FileUploadExceptionAdvice {
@ExceptionHandler(MaxUploadSizeExceededException.class)
@ResponseStatus(HttpStatus.PAYLOAD_TOO_LARGE)
public String handleMaxSizeException(MaxUploadSizeExceededException exc) {
return "File too large!";
}
}
4. 总结
通过Spring Boot处理文件上传和下载是非常简单的。关键步骤包括:
- 文件上传:通过
MultipartFile
处理上传的文件,将其保存到服务器指定目录。 - 文件下载:通过
ResponseEntity
返回文件资源,设置Content-Disposition
头部,指示浏览器以附件形式下载文件。 - 异常处理:可以通过
@ControllerAdvice
或try-catch
块来处理文件上传和下载过程中的异常,确保应用的健壮性。
这个过程涵盖了从文件上传、存储到下载的完整流程,使得在Spring Boot中处理文件变得非常直观和简便。