pring Boot文件上传功能

139 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第20天,点击查看活动详情

Spring Boot文件上传配置项

由于Spring Boot自动配置机制的存在,开发人员在Spring Boot项目中开发文件上传功能时并不需要进行多余的设置。只要在pom.xml文件中引入了spring-boot-starter-web依赖即可直接调用文件上传功能。虽然不用配置也可以使用文件上传功能,但是开发人员在文件上传时也可能有一些特殊的需求。因此,这里需要对Spring Boot中MultipartFile的常用设置进行介绍,其配置项和默认值如下图所示。

image.png

配置含义注释:

  • spring.servlet.multipart.enabled

    是否支持 multipart 上传文件,默认支持

  • spring.servlet.multipart.file-size-threshold

    文件大小阈值,当大于这个阈值时将写入到磁盘,否则存在内存中,(默认值 0 ,一般情况下不用特意修改)

  • spring.servlet.multipart.location

    上传文件的临时目录

  • spring.servlet.multipart.max-file-size

    最大支持文件大小,默认 1 M ,该值可适当的调整

  • **spring.servlet.multipart.max-request-size=10Mb **

    最大支持请求大小,默认 10 M

  • spring.servlet.multipart.resolve-lazily

    判断是否要延迟解析文件(相当于懒加载,一般情况下不用特意修改)

新建文件上传页面


<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>Spring Boot 文件上传测试</title>
</head>
<body>
<form action="/uploadFile" method="post" enctype="multipart/form-data">
   <input type="file" name="file" />
   <input type="submit" value="文件上传" />
</form>
</body>
</html>

后端处理文件上传的请求地址为/uploadFile,请求方法为POST。需要注意的是在文件上传时需要设置form表单的enctype属性为“multipart/form-data”。

建文件上传处理 Controller 类

在controller包下新建UploadController类并编写实际的文件上传逻辑代码

@Controller
public class UploadController {
    // 文件保存路径为在D盘下的upload文件夹,可以按照自己的习惯来修改
    private final static String FILE_UPLOAD_PATH = "D:\upload\";
    @RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
    @ResponseBody
    public String uploadFile(@RequestParam("file") MultipartFile file) {
        if (file.isEmpty()) {
            return "上传失败";
        }
        String fileName = file.getOriginalFilename();
        String suffixName = fileName.substring(fileName.lastIndexOf("."));
        //生成文件名称通用方法
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
        Random r = new Random();
        StringBuilder tempName = new StringBuilder();
        tempName.append(sdf.format(new Date())).append(r.nextInt(100)).append(suffixName);
        String newFileName = tempName.toString();
        try {
            // 保存文件
            byte[] bytes = file.getBytes();
            Path path = Paths.get(FILE_UPLOAD_PATH + newFileName);
            Files.write(path, bytes);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "上传成功";
    }
}

由于Spring Boot已经自动配置了StandardServletMultipartResolver类来处理文件上传请求,因此能够直接在控制器方法中使用MultipartFile读取文件信息。 @RequestParam中文件名称属性需要与前端页面中input文件输入框设置的name属性一致。如果文件为空则返回上传失败,如果不为空则根据日期生成一个新的文件名,然后读取文件流程并写入指定的路径中,最后返回上传成功的提示信息。

需要注意的是文件上传路径的设置。在上述代码中设置的文件保存路径为D:\upload\,即 在D 盘下的upload文件夹。当然,开发人员可以按照自己的习惯修改为其他目录名称。D:\upload\这种写法是在Windows系统下的路径写法,如果项目部署在Linux系统中的话,写法与此不同。比如想要把文件上传到/opt/newbee/upload目录下,就需要把路径设置的代码改为private final static String FILE_UPLOAD_PATH = "/opt/newbee/upload/"。两种系统的写法存在一些差异。

编写完成以后,运行项目进行测试