SpringBoot 文件上传+拦截器
SpringBoot 文件上传+拦截器
文件上传原理
- 表单的enctype属性规定在发送到服务器之前应该如何对表单数据进行编码。
- 当表单的enctype="application/x-www-form-urlencoded"(默认)时,form表单中的数据格式为:key=value&key=value。
- 当表单的enctype="multipart/form-data"时,其传输数据如下:
SpringBoot实现文件上传功能
- SpringBoot工程嵌入的tomcat限制了请求的文件大小,每个文件的配置最大为1MB,单次请求的文件总数不能大于10MB。
- 要更改这个默认值需要在配置文件(如application.properties)中加入两个配置
# 单个文件大小
spring.servlet.multipart.max-file-size=10MB
# 每次请求所有文件大小
spring.servlet.multipart.max-request-size=10MB
- 当表单的enctype="multipart/form-data"时,可以使用MultipartFile获取上传的文件数据,再通过transferTo方法将其写入到磁盘中。
@RestController
public class FileUploadController {
@PostMapping("/upload")
public String up(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 dir = new File(path);
if (!dir.exists()){
//创建目录
dir.mkdir();
}
File file = new File(path+photo.getOriginalFilename());
photo.transferTo(file);
}
}
修改浏览器访问此图片的路径为:
# 第一个斜线代表服务器所在的目录
spring.web.resources.static-locations=/upload/
拦截器
- 拦截器在Web系统中非常常见,对于某些全局统一的操作,我们可以把它提取到拦截器中实现。总结起来,拦截器大致有以下使用场景:
- 权限检查:如登录检测,进入处理程序检测是否登录,如果没有,则直接返回登录页面。
- 性能监控:有时系统在某段时间莫名其妙很慢,可以通过拦截器在进入处理程序之前记录开始时间,在处理完后记录结束时间,从而得到改请求的处理时间。
- 通用行为:读取Cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有提取Locale、Theme信息等,只要是多个处理程序都需要的,即可使用拦截器使用。
-
SpringBoot定义了HandlerInterceptor接口来实现自定义拦截器的功能。
-
HandlerInterceptor接口定义了preHandle、postHandle、afterCompletion三种方法,通过重写这三种方法实现请求前、请求后等操作。
-
下面定义一个拦截器(注意:定义之后还要注册,此拦截器才能生效),实现HandlerInterceptor接口并重写父类方法
public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("LoginInterceptor"); return true; } }
拦截器注册
- addPathPatterns方法定义拦截的地址
- excludePathPatterns定义排除某些地址不被拦截
- 添加的一个拦截器没有addPathPattern任何一个url则默认拦截所有请求
- 如果没有excludePathPatterns任何一个请求,则默认不放过任何一个请求
@Configuration //加上该注解后SpringBoot会自动读取这个类,这样下面的配置才能生效
public class WebConfig implements WebMvcConfigurer {
@Override //重写父类的增加拦截器的方法
public void addInterceptors(InterceptorRegistry registry) {
//把定义的拦截器new出来
//registry.addInterceptor(new LoginInterceptor());
// 只拦截/user/**路径
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/postTest1");
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话