Spring MVC的文件上传和下载以及拦截器的使用实例
spring mvc会根据请求方法的签名不同,将请求消息中的信息以一定的方式转换并绑定到请求方法的参数中。
1.文件上传
文件上传,必须将表单的method设置为post,并将enctype设置为multipart/form-data。只有这样,才能将文件的二进制数据发送给服务器。
spring 3.0规范提供了方法来处理文件上传,但是这种上传需要在servlet中完成。而spring mvc封装了上传功能,使用了apache commons fileupload技术来实现了一个multipartresolver实现类。
spring mvc依赖的组件包
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的时候需要进行验证
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。