Springboot - 文件上传和拦截器
文件上传
当表单的enctype = “application/x-www-form-urlencoded时,其form表单数据格式为:key = value&key = value
当表单的enctype = “multipart/form-data” 时,其传输数据形式则为我们当前学习的文件类型
同理在Postman下进行接口测试时也需要指定上传文件

application.properties

文件上传控制器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| @RestController public class FileUploadController { private static final String UPLOADED_FOLDER = System.getProperty("user.dir") + "/upload";
@PostMapping("/upload") public String upload(String nickname, MultipartFile photo, HttpServletRequest request) throws IOException{ System.out.println(nickname); System.out.println(photo.getOriginalFilename()); System.out.println(photo.getContentType());
String path = request.getServletContext().getRealPath("/upload/"); System.out.println(path); saveFile(photo, path); return "上传成功"; }
public void saveFile(MultipartFile photo, String path) throws IOException{ File upDir = new File(path); if(!upDir.exists()){ upDir.mkdir(); } File file = new File(path + photo.getOriginalFilename()); photo.transferTo(file);
}
}
|
开启调试后在Postman中进行文件上传测试即可在调试控制台中看见对应的路径
拦截器
拦截器在web系统中非常常见,对于某些全局统一的操作,我们可以把它提取到拦截器中实现,其使用场景如下:
权限检查:登录检测等。
性能监控:通过拦截器在某个方法执行前记录时间,完成后记录时间,得到请求的处理时间。
通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,只要是多个处理程序都需要的,都可以使用拦截器实现。
方法
Springboot定义了HandlerInterceptor接口实现自定义拦截器功能
HandlerInterceptor接口定义了preHandle、postHandle、afterCompletion三种方法,分别对应方法实现请求前、后等操作

拦截器示例
实现拦截器
1 2 3 4 5 6 7 8
| public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){ System.out.println("LoginInterceptor"); return true; } }
|
注册拦截器
1 2 3 4 5 6 7 8
| @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry){ registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/user/**"); } }
|
这里注册到/user/目录的拦截器使访问/user/目录下的路径都需要经过拦截器,每访问一次在后台调试可以看见拦截器中的测试代码printf(“LoginInterceptor”)
:D 获取中...