您的位置:首页 > 编程语言 > Java开发

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

2014-05-29 23:26 411 查看
struts2漏洞爆发,近日修补漏洞,struts2.3.4.1升级到struts2.3.15.1,发现以前用uploadFile能正常上传文件显示进度条现在不能正常工作了,List items = 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<bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="struts" class="org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest" scope="default"/>
2<bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="jakarta" class="org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest" scope="default" />
3<constant name="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"
02name= "myRequestParser" class= "com.icf.common.base.actions.RequestParseWrapper"
03scope= "default" optional= "true " />
04<constant name= "struts.multipart.handler" value= "myRequestParser" />
05
06
07class
08public class RequestParseWrapper extends JakartaMultiPartRequest {
09
10publicvoid parse(HttpServletRequest servletRequest, String saveDir)throws IOException{
11}
12}
这样就可以得到request里的item的值了。

struts2.3.15.1的配置方式

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

在struts配置文件中

1<bean type= "org.apache.struts2.dispatcher.multipart.MultiPartRequest"
2name= "myRequestParser" class= "com.icf.common.base.actions.RequestParseWrapper"
3scope= "default" optional= "true " />
4<constant name= " struts.multipart.parser" value= "myRequestParser" />
class

1public class RequestParseWrapper extends JakartaMultiPartRequest {
2
3publicvoid parse(HttpServletRequest servletRequest, String saveDir)throws IOException{
4}
5}
下面的片断Class是利用spring mvc做的一个上传文件Controller中的一个方法

01@RequestMapping(value="/uploadFile",method=RequestMethod.POST)
02public void uploadFile(HttpServletRequest req,HttpServletResponse resp) {
03final HttpSession session = req.getSession();
04String path = session.getServletContext().getRealPath("/");
05File file = new File(path + "/upload");
06if(!file.exists()) file.mkdirs();
07boolean isMultipart = ServletFileUpload.isMultipartContent(req);
08if (!isMultipart) return;
09
10// Create a factory for disk-based file items
11FileItemFactory factory = new DiskFileItemFactory();
12// Create a new file upload handler
13ServletFileUpload upload = new ServletFileUpload(factory);
14//上传文件大小最大不能超过60M
15upload.setFileSizeMax(60000000);
16upload.setHeaderEncoding("UTF-8");
17
18upload.setProgressListener(new ProgressListener() {
19@Override
20public void update(long pBytesRead, long pContentLength, int pItems) {
21ProcessInfo pri = new ProcessInfo();
22pri.itemNum = pItems;
23pri.readSize = pBytesRead;
24pri.totalSize = pContentLength;
25pri.show =((float)pBytesRead/1000)+"/"+((float)pContentLength/1000)+" Kbyte";
26pri.rate = Math.round((float)pBytesRead/(float)pContentLength*100);
27session.setAttribute("proInfo", pri);
28try {
29Thread.sleep(1);
30} catch (InterruptedException e) {
31e.printStackTrace();
32}
33System.out.println("已经上传 " +pri.rate);
34
35}
36} );
37
38List<FileItem> items;
39
40try {
41items = upload.parseRequest(req);
42
43System.out.println("===========================================");
44for(FileItem item: items) {
45System.out.println("ContentType "+ item.getContentType());
46System.out.println(" 字段名 " + item.getFieldName());
47System.out.println("文件名 "+item.getName());
48System.out.println("文件大小 " + item.getSize());
49
50item.write(new File(file,item.getName()));
51}
52} catch (FileUploadException e) {
53// TODO Auto-generated catch block
54e.printStackTrace();
55} catch (Exception e) {
56// TODO Auto-generated catch block
57e.printStackTrace();
58}
59
转载于:http://my.oschina.net/guhai2004/blog/157852
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: