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"/> |
08 | publicclassRequestParseWrapperextendsJakartaMultiPartRequest { |
10 | publicvoid parse(HttpServletRequest servletRequest, String saveDir)throwsIOException{ |
这样就可以得到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 { |
3 | publicvoid parse(HttpServletRequest servletRequest, String saveDir)throwsIOException{ |
下面的片断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; |
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); |
15 | upload.setFileSizeMax(60000000); |
16 | upload.setHeaderEncoding("UTF-8"); |
18 | upload.setProgressListener(newProgressListener() { |
20 | publicvoidupdate(longpBytesRead,longpContentLength,intpItems) { |
21 | ProcessInfo pri =newProcessInfo(); |
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); |
30 | }catch(InterruptedException e) { |
33 | System.out.println("已经上传 "+pri.rate); |
41 | items = upload.parseRequest(req); |
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()); |
50 | item.write(newFile(file,item.getName())); |
52 | }catch(FileUploadException e) { |
53 | // TODO Auto-generated catch block |
56 | // TODO Auto-generated catch block |
转载于:http://my.oschina.net/guhai2004/blog/157852