全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Spring MVC的文件上传和下载以及拦截器的使用实例

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 中拦截器的使用示例详解"拦截器基本配置"  # 上传  # 是在  # 上传文件  # 自定义  # 设置为  # 表单  # 也就  # 将在  # 只需  # 要在  # 我们可以  # 请先  # 并将  # 它可以  # 请选择  # 能将  # 主要用于  # 装了 


相关文章: 微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  Swift中switch语句区间和元组模式匹配  高防服务器租用如何选择配置与防御等级?  家庭建站与云服务器建站,如何选择更优?  攀枝花网站建设,攀枝花营业执照网上怎么年审?  Python文件管理规范_工程实践说明【指导】  建站之星安装步骤有哪些常见问题?  如何在建站之星网店版论坛获取技术支持?  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  广州美橙建站如何快速搭建多端合一网站?  建站之星如何优化SEO以实现高效排名?  如何选择高性价比服务器搭建个人网站?  建站中国官网:模板定制+SEO优化+建站流程一站式指南  模具网站制作流程,如何找模具客户?  智能起名网站制作软件有哪些,制作logo的软件?  如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?  高端建站如何打造兼具美学与转化的品牌官网?  如何快速搭建个人网站并优化SEO?  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?  韩国服务器如何优化跨境访问实现高效连接?  建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略  如何用搬瓦工VPS快速搭建个人网站?  如何通过主机屋免费建站教程十分钟搭建网站?  制作农业网站的软件,比较好的农业网站推荐一下?  ,制作一个手机app网站要多少钱?  如何用wdcp快速搭建高效网站?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  如何通过西部数码建站助手快速创建专业网站?  如何在云指建站中生成FTP站点?  大学网站设计制作软件有哪些,如何将网站制作成自己app?  如何快速生成ASP一键建站模板并优化安全性?  一键制作网站软件下载安装,一键自动采集网页文档制作步骤?  如何通过远程VPS快速搭建个人网站?  网站设计制作企业有哪些,抖音官网主页怎么设置?  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  外汇网站制作流程,如何在工商银行网站上做外汇买卖?  中山网站推广排名,中山信息港登录入口?  如何用免费手机建站系统零基础打造专业网站?  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  平台云上自主建站:模板化设计与智能工具打造高效网站  如何使用Golang安装API文档生成工具_快速生成接口文档  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  建站主机是否属于云主机类型?  正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  定制建站平台哪家好?企业官网搭建与快速建站方案推荐 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。