Spring Boot文件上传功能的实现!超详细!
前言:
文件上传功能在很多系统中都占据非常重要的份置,软件开发人员在实现文件上传时,除了需要确保程序代码的稳健性和高维护性外,还需要从社会责任的角度审的需求,秉承合法、合规的职业理念进行数据读写,避免程序在保存用户上传的文件时造成不良的社会影响。例如,应该关注保护用户的隐私,避免用户的隐私泄露,以及杜绝上传非法文件。
项目目录:
一、设置上传配置
在项目的application.yml文件中对静态资源的映射和文件上传进行配置,具体代码如下:
spring: mvc: static-path-pattern: /backend/** # 配置Spring MVC静态资源的路径模式,表示所有以"/backend/"开头的请求都将被视为静态资源请求 web: resources: static-locations: # 配置静态资源的位置列表,可以包含多个位置 - file:E:/Chapter01/src/main/resources/backend/ # 指定一个外部文件系统目录作为静态资源的位置 servlet: multipart: max-file-size: 10MB # 设置单个上传文件的最大大小为10MB max-request-size: 50MB # 设置整个请求(包括所有文件和表单数据)的最大大小为50MB # 添加文件上传目录配置 file: upload-dir: E:/Chapter01/src/main/resources/backend/upload/
!!!注:路径分隔符:Windows 路径使用 / 或转义符 \\(如 E:\\path\\to\\dir)
上述配置属性在自动配置中也提供了默认配置,具体信息如下:
spring.servlet.multipart.max-file-size:用于设置单个上传文件的大小限制,默认值为1MB;
spring.servlet.multipart.max-request-size:用于设置所有上传文件的大小限制,默认值为10MB;
如果上传文件的大小超出默认作30MB,会出现"FileUploadBase$FileSizeLimitExeeededException: The field fileupload exceeds its maximum permitted size of 1048576 bytes"异常信息。
二、创建文件上传页面
在项目中的 src/main/resources 目录下创建 HTML(fileupload.html),页面用于操作文件上传,具体代码如下:
文件上传
|
|
在上述代码中,第 9~26 行代码定义了一个表单,其中,表单中必须设置 enctype属性的值为"multipartform-data",并且请求方式为post,第16 行和第 22 行代码分别定义了文件选择控件和按钮控件,并为按钮控件绑定了鼠标单击事件。第28~48 行代码定义uploadAction()方法,该方法在单击按钮时触发,触发时异步提交表单,如果提交成功,将表单中上传的图标显示在页面中。
三、创建文件上传控制器类
在创建文件上传控制器类之前先在src/main/java目录下创建entity包,在该包下创建Result类,具体代码如下:
package org.example.chapter01.entity; import java.io.Serializable; /** * 封装返回结果 */ public class Result implements Serializable{ private boolean flag;//执行结果,true为执行成功 false为执行失败 private String message;//返回结果信息,主要用于页面提示信息 private Object data;//返回数据 public Result(boolean flag, String message) { super(); this.flag = flag; this.message = message; } public Result(boolean flag, String message, Object data) { this.flag = flag; this.message = message; this.data = data; } public boolean isFlag() { return flag; } public void setFlag(boolean flag) { this.flag = flag; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } }
创建文件上传控制器类在项目chapter01的com.itheima.chapter01.controller包下创建控制器类FileController,在该类中处理文件上传的请求,将上传的文件存放在指定路径下,并返回上传结果,具体代码如下:
package org.example.chapter01.controller; import org.example.chapter01.entity.Result; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.util.UUID; @RestController public class FileController { @Value("${file.upload-dir}") private String UPLOAD_DIR; @RequestMapping("/fileUpload") public Result fileUpload(MultipartFile[] files) { if (files == null || files.length == 0) { return new Result(false, "未选择文件!"); } for (MultipartFile file : files) { if (file.isEmpty()) { continue; } String originalName = file.getOriginalFilename(); String suffix = originalName.substring(originalName.lastIndexOf(".")); if (!".jpg".equalsIgnoreCase(suffix)) { return new Result(false, "仅支持JPG格式图片!"); } String newFileName = UUID.randomUUID() + suffix; File targetDir = new File(UPLOAD_DIR); if (!targetDir.exists()) { boolean created = targetDir.mkdirs(); System.out.println("目录创建结果: " + created); if (!created) { return new Result(false, "无法创建上传目录!"); } } try { File targetFile = new File(targetDir.getAbsolutePath() + File.separator + newFileName); file.transferTo(targetFile); // 返回相对路径,前端可以通过/static-path-pattern访问 return new Result(true, "/backend/upload/" + newFileName); } catch (Exception e) { e.printStackTrace(); return new Result(false, "上传失败:" + e.getMessage()); } } return new Result(true, "文件上传成功!"); }
四、程序效果测试
在浏览器中访问fileupload.html,如下图所示:
单击“选择文件”按钮,选择一个后缀名不是jpg的文件,然后单击“提交”按钮,效果如下图所示:
再次单击“选择文件”按钮,选择后缀名是jpg的文件,然后单击“提交”按钮,效果如下图所示:
由上图可以看出,页面中展示了上传的图片,此时项目src/main/resources 目录下多了一个upload文件夹,文件夹下存放了刚才上传的文件,说明文件上传成功,并且在浏览器中获取到指定静态资源文件夹中的图片。