欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-02-19 22:16:46
spring mvc会根据请求方法的签名不同,将请求消息中的信息以一定的方式转换并绑定到请求方法的参数中。 1.文件上传 文件上传,必须将表单的method设置为p...

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的时候需要进行验证

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。