如何使用SpringBoot实现文件的上传和下载?

参考回答

在 Spring Boot 中,实现文件的上传和下载是通过使用 Spring MVC 提供的相关功能来完成的。上传文件通常需要处理 multipart/form-data 请求,而下载文件则是通过 ResponseEntityHttpServletResponse 返回文件内容。

文件上传:Spring Boot 通过配置文件上传限制和 @RequestParam 注解来处理文件上传。

文件下载:通过读取文件并将其作为响应内容返回,使用 ResponseEntity 或直接写入 HttpServletResponse

详细讲解与拓展

1. 文件上传

步骤一:在 application.properties 中配置文件上传的大小限制。

# 设置上传文件的最大大小
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
.properties

步骤二:创建上传接口,使用 @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());
        }
    }
}
Java
  • 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>
HTML

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);
        }
    }
}
Java
  • @PathVariable 用来从 URL 中提取文件名。
  • UrlResource 是 Spring 用来表示文件的 Resource 实现,允许通过 URI 访问文件。
  • 通过 Content-Disposition 头指定文件是作为附件下载,而不是直接显示在浏览器中。

步骤二:前端的文件下载请求示例:

<a href="/file/download/sample.txt" download>Download File</a>
HTML

3. 自定义文件上传和下载功能

除了简单的文件上传和下载,Spring Boot 还允许我们进行更多的定制化操作,比如设置上传文件的最大数量、限制文件类型、实现文件压缩等。

自定义文件上传大小和限制

spring.servlet.multipart.max-file-size=5MB
spring.servlet.multipart.max-request-size=10MB
spring.servlet.multipart.enabled=true
.properties

可以通过以上配置进一步限制上传文件的大小。如果需要限制上传的文件类型,可以在文件上传处理方法中加入判断。

文件类型判断示例:

if (!file.getContentType().equals("image/png")) {
    return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Only PNG files are allowed.");
}
Java

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());
    }
}
Java

总结

使用 Spring Boot 实现文件上传和下载非常简单。通过配置 spring.servlet.multipart 来设置文件上传的大小限制,使用 MultipartFile 接收上传的文件,使用 ResponseEntityHttpServletResponse 来处理文件下载。在文件上传时,可以结合数据库存储文件信息,或者增加文件类型和大小的限制以增强安全性。

发表评论

后才能评论