struts2.3.4和struts2.3.15.1 Fileupload上传文件简单分析

struts2漏洞爆发,近日修补漏洞,struts2.3.4.1升级到struts2.3.15.1,发现以前用uploadFile能正常上传文件显示进度条现在不能正常工作了,Listitems=upload.parseRequest(request),items为空,得不到HttpServletRequest值了。
研究了一天,也在网上转了一天,终于得到灵感,查看了一下struts2.3.15.1的struts-default.xml配置文件,发现<constant name="struts.multipart.handler" value="jakarta" />已经变成了parser,在原来的项目中把struts.multipart.handler换成了struts.multipart.parser,一切OK,正常了。
配置完成了,就可以直接利用uploadFile中的监听器来完成文件上传进度的判断了和上传文件了。
这是struts2.3.15.1的默认配置
1 <beantype="org.apache.struts2.dispatcher.multipart.MultiPartRequest"name="struts"class="org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest"scope="default"/>
2 <beantype="org.apache.struts2.dispatcher.multipart.MultiPartRequest"name="jakarta"class="org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest"scope="default"/>
3 <constantname="struts.multipart.parser"value="jakarta"/>
Struts2 中用Fileupload上传文件得不到HttpServletRequest值的解决办法

在status2 .3.4.1的配置方式

在status2 .3.4.1的配置文件里加上
01 <bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest"
02 name="myRequestParser"class="com.icf.common.base.actions.RequestParseWrapper"
03 scope="default"optional="true "/>
04 <constant name="struts.multipart.handler"value="myRequestParser"/>
05
06
07 class
08 publicclassRequestParseWrapperextendsJakartaMultiPartRequest {
09
10 publicvoid parse(HttpServletRequest servletRequest, String saveDir)throwsIOException{
11 }
12 }


这样就可以得到request里的item的值了。

struts2.3.15.1的配置方式

在struts2.3.15.1后的配置里,struts2的struts-default.xml 里把struts.multipart.handler 改成了struts.multipart.parser

在struts配置文件中
1 <beantype="org.apache.struts2.dispatcher.multipart.MultiPartRequest"
2 name="myRequestParser"class="com.icf.common.base.actions.RequestParseWrapper"
3 scope="default"optional="true "/>
4 <constantname=" struts.multipart.parser"value="myRequestParser"/>
class
1 publicclassRequestParseWrapperextendsJakartaMultiPartRequest {
2
3 publicvoid parse(HttpServletRequest servletRequest, String saveDir)throwsIOException{
4 }
5 }

下面的片断Class是利用spring mvc做的一个上传文件Controller中的一个方法
01 @RequestMapping(value="/uploadFile",method=RequestMethod.POST)
02 publicvoiduploadFile(HttpServletRequest req,HttpServletResponse resp) {
03 finalHttpSession session = req.getSession();
04 String path = session.getServletContext().getRealPath("/");
05 File file =newFile(path +"/upload");
06 if(!file.exists()) file.mkdirs();
07 booleanisMultipart = ServletFileUpload.isMultipartContent(req);
08 if(!isMultipart)return;
09
10 // Create a factory for disk-based file items
11 FileItemFactory factory =newDiskFileItemFactory();
12 // Create a new file upload handler
13 ServletFileUpload upload =newServletFileUpload(factory);
14 //上传文件大小最大不能超过60M
15 upload.setFileSizeMax(60000000);
16 upload.setHeaderEncoding("UTF-8");
17
18 upload.setProgressListener(newProgressListener() {
19 @Override
20 publicvoidupdate(longpBytesRead,longpContentLength,intpItems) {
21 ProcessInfo pri =newProcessInfo();
22 pri.itemNum = pItems;
23 pri.readSize = pBytesRead;
24 pri.totalSize = pContentLength;
25 pri.show =((float)pBytesRead/1000)+"/"+((float)pContentLength/1000)+" Kbyte";
26 pri.rate = Math.round((float)pBytesRead/(float)pContentLength*100);
27 session.setAttribute("proInfo", pri);
28 try{
29 Thread.sleep(1);
30 }catch(InterruptedException e) {
31 e.printStackTrace();
32 }
33 System.out.println("已经上传 "+pri.rate);
34
35 }
36 } );
37
38 List<FileItem> items;
39
40 try{
41 items = upload.parseRequest(req);
42
43 System.out.println("===========================================");
44 for(FileItem item: items) {
45 System.out.println("ContentType "+ item.getContentType());
46 System.out.println(" 字段名 "+ item.getFieldName());
47 System.out.println("文件名 "+item.getName());
48 System.out.println("文件大小 "+ item.getSize());
49
50 item.write(newFile(file,item.getName()));
51 }
52 }catch(FileUploadException e) {
53 // TODO Auto-generated catch block
54 e.printStackTrace();
55 }catch(Exception e) {
56 // TODO Auto-generated catch block
57 e.printStackTrace();
58 }
59
转载于:http://my.oschina.net/guhai2004/blog/157852
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值