手工处理 Struts2 框架上传的文件
在使用了 Struts2 框架的系统中,对于处理像下面这种表单上传文件时:
view source
print?
1.<form action="..." enctype="multipart/form-data">
2. 文件:<input type="file" name="upload"><br>
3. 描述:<input type="text" name="desc"></br>
4. <input type="submit" value="提交">
5.</form>
自然而然的想法就是在 Action 中声明变量 File upload 和 String desc,请求提交到这个 Action 后,在 execute() 方法中就能直接使用 upload 和 desc 了,它们已被 Struts2 框架(org.apache.struts2.interceptor.FileUploadInterceptor 监听器) 赋上了相应的值了。
因为维护的是一个古老的项目,请求都是直接提交给 jsp。在这个项目中套上了 Struts2 已是不易了。原来项目是用的 jspSmartUpload 来处理上传文件的,Struts2 一上 jspSmartUpload 便不能正常工作了,因为 Struts2 的过滤器 org.apache.struts2.dispatcher.FilterDispatcher 拦截的是所有的请求,在交把请求交给 jspSmartUpload 之前请求 request 就已被处理过了,即使是把 struts2-core-2.x.x.jar 中的 struts-default.xml fileUpload 取消了也是如此。
暂时又不想再新加一个 Action,声明 upload:File 和 desc:String 直接接收参数,这样改动的话实在是大,现在 struts.xml 和 struts.properties 文件还是空的呢。所以姑且在原来那个 jsp 中处理吧。
最早做过 jsp 文件上传的人都知道,给 form 加上 enctype="multipart/form-data" 属性后,request.getParameter("desc") 取输入框的值就失灵了,因为页面请求数据是以流的形式发送给服务器的,所以 jspSmartUpload 用了它自己的 Request, com.jspsmart.upload.SmartUpload.getRequest().getParameter("desc") 来接收文本框数据,但对于 Struts2 处理过的 request jspSmartUpload 就无能为力了。
那么在 Struts2 中的 jsp 如何获取到 enctype="multipart/form-data" 表单传递过来的文本输入和文件呢?
·获取文本框的值 ,仍然可用 request.getParameter("desc"),因为此时的 request 是由 org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper 实现的。
对比一下不同时候 request 的具体实现类(Tomcat 环境中)
form enctype multipart/form-data application/x-www-form-urlencoded
Struts2 org.apache.struts2.dispatcher.multipart
.MultiPartRequestWrapper org.apache.struts2.dispatcher
.StrutsRequestWrapper
Struts1 org.apache.struts.upload
.MultipartRequestWrapper org.apache.coyote.tomcat5
.CoyoteRequestFacade
无框架 org.apache.coyote.tomcat5
.CoyoteRequestFacade org.apache.coyote.tomcat5
.CoyoteRequestFacade
·获取上传来的文件 用就要对 request 作个转型,才能调用到相应的方法
view source
print?
1.MultiPartRequestWrapper mpRequest = (MultiPartRequestWrapper)request;
2.
3.File[] files = mpRequest.getFiles("upload"); //文件现在还在临时目录中
4.String[] fileNames = mpRequest.getFileNames("upload");
5.
6.//然后就可以处理你的业务了
其他方法可以查看 MultiPartRequestWrapper API,MultiPartRequestWrapper 是继承自 org.apache.struts2.dispatcher.StrutsRequestWrapper 的。
最后,用了 Struts2 来上传文件,最好在 web.xml 中加上 ActionContextCleanUp 过滤器以避免一些未不预知的异常。
view source
print?
01.<filter>
02. <filter-name>struts-cleanup</filter-name>
03. <filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>
04.</filter>
05.
06.<filter-mapping>
07. <filter-name>struts-cleanup</filter-name>
08. <url-pattern>/*</url-pattern>
09.</filter-mapping>
网上有人说是要加 ActionContextCleanUp 过滤器的,ActionContextCleanUp 的代码注释是它易于同 SiteMesh 的整合,至于为何与文件上传扯上关系,我以后也会关注的。
对了还要在项目中引入 commons-fileupload-x.x.x.jar 和 commons-io-x.x.jar 包,其他没有什么特别的配置,默认即可。相信本文的实用性不强,不会有人用 jsp 来处理这些事情,参考价值可能还有一些。
分享到:
相关推荐
基于struts2 框架的文 件上传 copy 模式 字节流上传 字符流上传
Struts2框架实现文件上传功能
struts框架-文件上传下载 有研究或探讨的请加群:37424970 或联系本人MSN或邮箱:zhuseahui@yahoo.com.cn
最近自学java中的框架-struts写了一些小例子,这都是很经典的程序,如果大家瞧得起要下载去看看,顺便给俺找找不足的地方。我的qq 821865130 email qingtian_hechen@163.com 希望大家能多多给我帮助。在此谢谢各位!...
使用struts2框架进行文件的上传并限制文件的大小与类型,使用struts2框架实现文件下载
struts框架写的文件上传下载系统 注册会员以后 用户可以上传文件到服务器,并查看服务器端所有上传文件、下载...
基于HT T P 传输协议, 采用Struts2 框架整合Spring 框架技术对Web 中文件的上传下载进 行应用研究. 提出的技术整合方案结合了Struts2 的自身特点, 通过与Str ut1 框架实现模型的分析 比较, 展示了Struts2 在文件上传...
Struts框架文件上传下载案例,需要的自取。
Struts2文件上传下载和表单重复提交问题
用Struts框架实现单文件上传功能(初学者的入门项目案例),本项目适合课后作业的哦.
使用struts2框架的一个文件上传demo。。大家互相学习学习,里面有注释了,觉得好的顶一下吧。
这个项目可将文件上传作为数据源,而且可以将查询的结果作为下载的文件
该项目采用的是典型的struts2框架,在此框架之上实现了多文件上传的功能。
Struts2框架,版本号2.3.29,比较经典的版本,包含所需的jar包还有xml示例文件,因为源码包太大上传不了,所以需要源码私下联系我。
commons-fileupload-1.2.1.jar:文件上传组件,2.1.6版本后必须加入此文件 commons-io-1.3.2.jar freemarker-2.3.15.jar:Struts 2的UI标签的模板 ognl-2.7.3.jar :对象图导航语言(Object Graph Navigation ...
利用struts2框架实现uploadidfy多文件上传,显示进度条上传
该属性指定需要Struts 2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts 2处理.如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开. struts.serve.static 该属性设置是否...
java struts2实现文件上传进度条显示
通过struts2框架实现Struts2文件上传下载以及显示。综合实现数据的利用。
是以struts2框架实现的文件上传功能