Spring Boot 文件上传后缀过滤

在开发Web应用程序时,我们经常需要实现文件上传功能。然而,有时我们只希望允许特定类型的文件上传,而禁止其他类型的文件。本文将介绍如何利用Spring Boot框架实现文件上传后缀过滤的功能。

一、Spring Boot 文件上传

在使用Spring Boot实现文件上传功能之前,我们需要首先配置文件上传的相关属性。在application.properties或application.yml配置文件中添加如下属性:

# 设置文件上传的最大文件大小,单位为字节
spring.servlet.multipart.max-file-size=10MB
# 设置请求的最大大小,单位为字节
spring.servlet.multipart.max-request-size=10MB
# 设置临时存储目录
spring.servlet.multipart.location=/tmp

以上配置的含义如下:

  • spring.servlet.multipart.max-file-size:设置文件上传的最大文件大小,单位为字节。在上述例子中,最大文件大小为10MB。
  • spring.servlet.multipart.max-request-size:设置请求的最大大小,单位为字节。在上述例子中,最大请求大小为10MB。
  • spring.servlet.multipart.location:设置临时存储目录。在上述例子中,临时存储目录为/tmp。

接下来,我们需要编写一个控制器类来处理文件上传的请求。

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

@Controller
public class FileUploadController {

    @PostMapping("/upload")
    public String handleFileUpload(@RequestParam("file") MultipartFile file) {
        // 处理文件上传逻辑
        return "redirect:/success";
    }
}

在上述例子中,我们使用@PostMapping注解来处理文件上传的POST请求。@RequestParam("file")表示接收名为"file"的文件参数。在handleFileUpload方法中,我们可以实现文件上传的逻辑,比如将文件保存到本地或存储到数据库中。

二、文件后缀过滤

为了实现文件上传后缀过滤的功能,我们可以通过在文件上传之前对文件后缀进行判断,从而决定是否允许文件上传。可以使用FilenameUtils工具类来获取文件的后缀名。

首先,我们需要引入Apache Commons IO库,添加以下依赖到项目的pom.xml文件中:

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.11.0</version>
</dependency>

然后,我们可以在handleFileUpload方法中添加文件后缀过滤的逻辑。

import org.apache.commons.io.FilenameUtils;

@PostMapping("/upload")
public String handleFileUpload(@RequestParam("file") MultipartFile file) {
    // 获取文件后缀
    String extension = FilenameUtils.getExtension(file.getOriginalFilename());

    // 判断文件后缀是否允许上传
    if (!isAllowedExtension(extension)) {
        return "redirect:/error";
    }

    // 处理文件上传逻辑
    return "redirect:/success";
}

private boolean isAllowedExtension(String extension) {
    // 允许上传的文件后缀集合
    List<String> allowedExtensions = Arrays.asList("jpg", "jpeg", "png");

    // 判断文件后缀是否在允许上传的集合中
    return allowedExtensions.contains(extension);
}

在上述例子中,我们首先通过FilenameUtils.getExtension方法获取文件的后缀名。然后,我们使用isAllowedExtension方法判断文件后缀是否在允许上传的集合中。如果文件后缀不在允许上传的集合中,则返回错误页面,否则继续处理文件上传逻辑。

三、类图

下面是本文示例代码的类图:

classDiagram
    class FileUploadController {
        + handleFileUpload(MultipartFile file) : String
        - isAllowedExtension(String extension) : boolean
    }

在上述类图中,FileUploadController是处理文件上传的控制器类。包含一个公有方法handleFileUpload用于处理文件上传的请求,一个私有方法isAllowedExtension用于判断文件后缀是否允许上传。

四、序列图

下面是文件上传的序列图:

sequenceDiagram