如何使用SpringBoot实现文件的上传和下载?
参考回答
在 Spring Boot 中,实现文件的上传和下载是通过使用 Spring MVC 提供的相关功能来完成的。上传文件通常需要处理 multipart/form-data 请求,而下载文件则是通过 ResponseEntity 或 HttpServletResponse 返回文件内容。
文件上传:Spring Boot 通过配置文件上传限制和 @RequestParam 注解来处理文件上传。
文件下载:通过读取文件并将其作为响应内容返回,使用 ResponseEntity 或直接写入 HttpServletResponse。
详细讲解与拓展
1. 文件上传
步骤一:在 application.properties 中配置文件上传的大小限制。
# 设置上传文件的最大大小
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
步骤二:创建上传接口,使用 @RequestParam 注解接收文件。
@RestController
@RequestMapping("/file")
public class FileController {
private final String UPLOAD_DIR = "uploads/";
// 文件上传接口
@PostMapping("/upload")
public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) {
try {
// 获取上传文件的原始文件名
String fileName = file.getOriginalFilename();
// 保存文件到指定目录
Path path = Paths.get(UPLOAD_DIR + fileName);
Files.copy(file.getInputStream(), path, StandardCopyOption.REPLACE_EXISTING);
return ResponseEntity.ok("File uploaded successfully: " + fileName);
} catch (IOException e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("Error uploading file: " + e.getMessage());
}
}
}
MultipartFile是 Spring 提供的接口,表示上传的文件。@RequestParam("file")用来绑定上传的文件。Files.copy用来将文件保存到服务器的指定目录。
步骤三:前端上传文件的 HTML 表单示例:
<form action="/file/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file" />
<button type="submit">Upload</button>
</form>
2. 文件下载
步骤一:创建文件下载接口,使用 ResponseEntity 返回文件内容。
@RestController
@RequestMapping("/file")
public class FileController {
private final String UPLOAD_DIR = "uploads/";
// 文件下载接口
@GetMapping("/download/{fileName}")
public ResponseEntity<Resource> downloadFile(@PathVariable String fileName) {
try {
Path path = Paths.get(UPLOAD_DIR + fileName);
// 如果文件存在,创建 Resource 对象
Resource resource = new UrlResource(path.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 (MalformedURLException e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
}
}
}
@PathVariable用来从 URL 中提取文件名。UrlResource是 Spring 用来表示文件的Resource实现,允许通过 URI 访问文件。- 通过
Content-Disposition头指定文件是作为附件下载,而不是直接显示在浏览器中。
步骤二:前端的文件下载请求示例:
<a href="/file/download/sample.txt" download>Download File</a>
3. 自定义文件上传和下载功能
除了简单的文件上传和下载,Spring Boot 还允许我们进行更多的定制化操作,比如设置上传文件的最大数量、限制文件类型、实现文件压缩等。
自定义文件上传大小和限制
spring.servlet.multipart.max-file-size=5MB
spring.servlet.multipart.max-request-size=10MB
spring.servlet.multipart.enabled=true
可以通过以上配置进一步限制上传文件的大小。如果需要限制上传的文件类型,可以在文件上传处理方法中加入判断。
文件类型判断示例:
if (!file.getContentType().equals("image/png")) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Only PNG files are allowed.");
}
4. 文件上传与数据库结合
在一些场景下,我们需要把文件路径或其他信息存储到数据库中。在上传文件时,可以将文件路径保存到数据库,便于后续的管理和检索。
示例:
@PostMapping("/upload")
public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) {
try {
String fileName = file.getOriginalFilename();
Path path = Paths.get(UPLOAD_DIR + fileName);
Files.copy(file.getInputStream(), path, StandardCopyOption.REPLACE_EXISTING);
// 假设有一个 FileEntity 来存储文件信息
FileEntity fileEntity = new FileEntity(fileName, path.toString());
fileRepository.save(fileEntity); // 保存文件信息到数据库
return ResponseEntity.ok("File uploaded and saved to database.");
} catch (IOException e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("Error uploading file: " + e.getMessage());
}
}
总结
使用 Spring Boot 实现文件上传和下载非常简单。通过配置 spring.servlet.multipart 来设置文件上传的大小限制,使用 MultipartFile 接收上传的文件,使用 ResponseEntity 或 HttpServletResponse 来处理文件下载。在文件上传时,可以结合数据库存储文件信息,或者增加文件类型和大小的限制以增强安全性。