您的位置:

SpringBoot文件上传详解

一、前言

随着互联网的发展,文件上传成为了必备的功能之一,而SpringBoot作为目前最流行的开发框架之一,为文件上传提供了便捷而强大的解决方案。

二、使用multipart/form-data协议进行文件上传

HTTP协议中支持文件上传的ContentType为multipart/form-data,SpringBoot通过MultipartFile接口提供了对该协议的支持。

在Controller中使用MultipartFile实现文件上传:


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

这里的@RequestParam("file")指定了上传文件对应的参数名,SpringBoot会自动将上传的文件封装成MultipartFile类型的参数传递给Controller方法。

上传文件的前端代码:



   
<input type="file" name="file" /> <input type="submit" value="上传" />

三、限制上传文件大小

默认情况下,SpringBoot没有对上传文件大小进行限制,但是可以通过配置上传文件大小来限制用户上传文件的大小。

在application.properties或是application.yml文件中添加以下配置:


# 限制上传文件大小为10MB
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB

其中,max-file-size表示单个文件上传大小,max-request-size表示总上传大小。若超过限制,则会报FileSizeLimitExceededException异常。

四、保存上传文件

接收到上传文件后,一般需要将文件保存到服务器的磁盘或是云存储中,SpringBoot通过MultipartFile提供的transferTo方法可以从MultipartFile中获取文件内容并保存到指定的位置。


@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
    // 获取上传文件名
    String fileName = file.getOriginalFilename();
    // 拼接保存文件的路径
    String filePath = request.getSession().getServletContext().getRealPath("upload/");
    // 如果路径不存在则创建该路径
    File dest = new File(filePath + fileName);
    if (!dest.getParentFile().exists()) {
        dest.getParentFile().mkdirs();
    }
    try {
        // 保存文件
        file.transferTo(dest);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return "success";
}

该示例中,首先获取上传文件的原始名称,接着通过HttpServletRequest获取到保存文件的路径,之后判断路径是否存在,若不存在则创建该路径,最后调用transferTo方法将文件保存到指定位置。

五、处理多文件上传

在某些情况下,需要一次性上传多个文件,此时可以使用SpringBoot提供的MultipartHttpServletRequest实现多文件上传。


@PostMapping("/multiUpload")
public String multiUpload(HttpServletRequest request) {
    List
    files = ((MultipartHttpServletRequest) request).getFiles("file");
    for (MultipartFile file : files) {
        // 处理上传文件
    }
    return "success";
}

   

该示例中,首先获取上传的所有文件通过MultipartHttpServletRequest的getFiles方法获取到MultipartFile集合,之后遍历集合处理每一个上传文件。

六、完成代码

上传文件Controller的完整代码:


@Controller
public class UploadController {

    @GetMapping("/upload")
    public String upload() {
        return "upload";
    }

    @GetMapping("/multiUpload")
    public String multiUpload() {
        return "multiUpload";
    }

    @PostMapping("/upload")
    public String upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
        // 获取上传文件名
        String fileName = file.getOriginalFilename();
        // 拼接保存文件的路径
        String filePath = request.getSession().getServletContext().getRealPath("upload/");
        // 如果路径不存在则创建该路径
        File dest = new File(filePath + fileName);
        if (!dest.getParentFile().exists()) {
            dest.getParentFile().mkdirs();
        }
        try {
            // 保存文件
            file.transferTo(dest);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "success";
    }

    @PostMapping("/multiUpload")
    public String multiUpload(HttpServletRequest request) {
        List
    files = ((MultipartHttpServletRequest) request).getFiles("file");
        for (MultipartFile file : files) {
            // 处理上传文件
        }
        return "success";
    }
}

   

上传文件的HTML代码:





    
   
    文件上传


    
   
<input type="file" name="file" /> <input type="submit" value="上传" />