Spring MVC的文件上传和下载以及拦截器的使用实例
发布时间 - 2026-01-11 02:40:45 点击率:次Spring MVC会根据请求方法的签名不同,将请求消息中的信息以一定的方式转换并绑定到请求方法的参数中。

1.文件上传
文件上传,必须将表单的method设置为POST,并将enctype设置为multipart/form-data。只有这样,才能将文件的二进制数据发送给服务器。
Spring 3.0规范提供了方法来处理文件上传,但是这种上传需要在Servlet中完成。而Spring MVC封装了上传功能,使用了Apache Commons FileUpload技术来实现了一个MultipartResolver实现类。
Spring MVC依赖的组件包
复制代码 代码如下:compile group: 'commons-fileupload', name: 'commons-fileupload', version: '1.3.3'
xml配置
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize"> <value>10485760</value> </property> <property name="defaultEncoding"> <value>UTF-8</value> </property> </bean>
后台代码
新建上传FileModel
public class FileDataModel implements Serializable {
private String filename;
private MultipartFile file;
public String getFilename() {
return filename;
}
public void setFilename(String filename) {
this.filename = filename;
}
public MultipartFile getFile() {
return file;
}
public void setFile(MultipartFile file) {
this.file = file;
}
}
Controller代码
@Controller
@RequestMapping("file")
public class FileController {
@RequestMapping("upload")
public String upload() {
return "upload";
}
@RequestMapping(value = "upload", method = RequestMethod.POST)
public String uoload(FileDataModel fileDataModel, HttpServletRequest request, Model model) {
FileResult fileResult = new FileResult();
try {
if (fileDataModel.getFilename().isEmpty() || fileDataModel.getFile() == null)
throw new IllegalArgumentException("上传文件名称为空或者无上传文件");
String filePath = request.getServletContext().getRealPath("/files");
String filename = fileDataModel.getFile().getOriginalFilename();
File savePath = new File(filePath, filename);
if (!savePath.getParentFile().exists())
savePath.getParentFile().mkdir();
fileDataModel.getFile().transferTo(new java.io.File(filePath + java.io.File.separator + filename));
fileResult.setTitle("上传成功");
fileResult.setMessage("上传成功");
fileResult.setSuccess(true);
} catch (Exception ex) {
fileResult.setTitle("上传失败!");
fileResult.setMessage(ex.getMessage());
}
model.addAttribute("fileResult", fileResult);
return "fileresult";
}
}
前台JSP页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Upload</title>
</head>
<body>
<form action="/file/upload" enctype="multipart/form-data" method="post">
<table>
<tr>
<td>文件描述:</td>
<td><input type="text" name="filename"/></td>
</tr>
<tr>
<td>请选择文件:</td>
<td><input type="file" name="file"/></td>
</tr>
<tr>
<td>
<input type="submit" value="上传"/>
</td>
</tr>
</table>
</form>
</body>
</html>
1.1Spring MVC的MultipartFile的常用方法
获取文件数据
1.[] getBytes() throws IOException;
获取文件的MIME类型,如image/jpeg等
2.String getContentType();
获取文件流
3.InputStream getInputStream() throws IOException;
获取表单中文件组件的名字
4.String getName();
获取上传文件的原名
5.String getOriginalFilename();
获取文件的字节大小,单位为byte
6.long getSize();
是否有上传的文件
7.boolean isEmpty();
将上传文件保存到一个目标文件中
8.void transferTo(File dest) throws IOException, IllegalStateException;
2.文件下载
Spring MVC提供了一个ResponseEntity类型,使用它可以很方便的定义返回的HttpHeader和HttpStatus
@RequestMapping("download")
public ResponseEntity<byte[]> download(HttpServletRequest request, @RequestParam("filename") String filename, Model model) {
ResponseEntity<byte[]> responseEntity = null;
try {
String path = request.getServletContext().getRealPath("/files");
String realPath = path + File.separator + filename;
File file = new File(realPath);
HttpHeaders headers = new HttpHeaders();
String downFileName = new String(filename.getBytes("UTF-8"), "iso-8859-1");
//通知浏览器以attachment(下载方式)打开图片
headers.setContentDispositionFormData("attachment", downFileName);
//以二进制流数据方式进行下载
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
responseEntity = new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED);
} catch (Exception ex) {
ex.printStackTrace();
}
return responseEntity;
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>${requestScope.fileResult.title}</title>
</head>
<body>
<h1>${requestScope.fileResult.message}</h1><br/>
<a href="/file/download?filename=${requestScope.fileResult.fileName}" rel="external nofollow" >${requestScope.fileResult.fileName}</a>
</body>
</html>
3.拦截器
Interceptor拦截器是Spring MVC中相当重要的功能,它的功能作用是拦截用户的请求并进行相对应的处理。比如通过拦截器进行用户权限验证,或者判断用户是否已经登录等。
Spring MVC 拦截器是可插拔式的设计。如果需要使用某个拦截器,只需要在配置文件中应用拦截器即可。
3.1 HandlerInterceptor接口
Spring MVC中的Interceptor拦截器请求是通过实现HandlerInterceptor接口来完成的。
3.2实现拦截器
1.自定义类实现Spring的HandlerInterceptor接口
重要接口
该请求方法将在请求处理之前被调用。这个方法的作用是对进行调用方法前进行一些前置初始化操作,进行判断用户请求是否可以进行下去。当方法返回false的时候,后续的Interceptor及Controller都不会继续执行。
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
该方法是在perHandle返回true时,在调用目标方法处理之后,在返回视图之前调用。这时候我们可以针对Controller处理之后的ModelAndView对象进行操作。
void postHandle( HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception;
该方法是在整个请求处理结束之后,也就是在DispatcherServlet渲染了对应的视图之后执行。主要用于清理资源。
void afterCompletion( HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception;
2.自定义类继承HandlerInterceptorAdapter
代码演示
实现HandlerInterceptor
public class AuthorizationInterceptor implements HandlerInterceptor {
/**
* 不拦截用户登录页面及注册页面
*/
private static final String[] IGNORE_URI = {"user/login", "user/signup"};
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
boolean flag = false;
String servletPath = request.getServletPath();
for (String url : IGNORE_URI) {
if (servletPath.contains(url)) {
flag = true;
break;
}
}
if (!flag) {
User user = (User) request.getSession().getAttribute("user");
if (user == null) {
request.setAttribute("message", "请先登录再访问网站");
request.getRequestDispatcher("user/login").forward(request, response);
} else
flag = true;
}
return flag;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
xml配置
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/home/index"/> <bean class="utils.AuthorizationInterceptor"/> </mvc:interceptor> </mvc:interceptors>
当访问home/index的时候需要进行验证
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Spring
# MVC
# 文件上传
# 文件下载
# 拦截器
# 详解SpringMVC HandlerInterceptor拦截器的使用与参数
# 简单总结SpringMVC拦截器的使用方法
# SpringMVC 拦截器的使用示例
# Spring MVC拦截器的基本使用方法
# 详解SpringMVC拦截器配置及使用方法
# 使用Spring MVC拦截器实现日志记录的方法
# 详解SpringMVC中使用Interceptor拦截器
# Spring MVC 中拦截器的使用示例详解"拦截器基本配置"
# 上传
# 是在
# 上传文件
# 自定义
# 设置为
# 表单
# 也就
# 将在
# 只需
# 要在
# 我们可以
# 请先
# 并将
# 它可以
# 请选择
# 能将
# 主要用于
# 装了
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel项目怎么部署到Linux_Laravel Nginx配置详解
如何快速生成专业多端适配建站电话?
Laravel如何保护应用免受CSRF攻击?(原理和示例)
Win11怎么设置默认图片查看器_Windows11照片应用关联设置
海南网站制作公司有哪些,海口网是哪家的?
Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】
制作旅游网站html,怎样注册旅游网站?
html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】
Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧
如何确保西部建站助手FTP传输的安全性?
宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法
香港服务器网站推广:SEO优化与外贸独立站搭建策略
JavaScript如何实现路由_前端路由原理是什么
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
Laravel如何为API编写文档_Laravel API文档生成与维护方法
Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】
canvas 画布在主流浏览器中的尺寸限制详细介绍
网站建设整体流程解析,建站其实很容易!
详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南
如何打造高效商业网站?建站目的决定转化率
Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】
Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控
Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践
javascript日期怎么处理_如何格式化输出
零服务器AI建站解决方案:快速部署与云端平台低成本实践
Firefox Developer Edition开发者版本入口
Laravel storage目录权限问题_Laravel文件写入权限设置
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
如何在阿里云香港服务器快速搭建网站?
如何在服务器上三步完成建站并提升流量?
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率
Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)
Laravel如何生成URL和重定向?(路由助手函数)
深圳网站制作培训,深圳哪些招聘网站比较好?
如何基于云服务器快速搭建网站及云盘系统?
Laravel用户密码怎么加密_Laravel Hash门面使用教程
网站制作报价单模板图片,小松挖机官方网站报价?
laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法
详解jQuery停止动画——stop()方法的使用
Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】
如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】
深圳网站制作的公司有哪些,dido官方网站?
,在苏州找工作,上哪个网站比较好?
无锡营销型网站制作公司,无锡网选车牌流程?
如何在景安云服务器上绑定域名并配置虚拟主机?
如何确认建站备案号应放置的具体位置?
Laravel如何生成和使用数据填充?(Seeder和Factory示例)
如何快速登录WAP自助建站平台?
Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册

