解决Struts2 使用Common-FileUpload List<FileItem>为空的问题
2016-06-28 18:06
357 查看
通常我们在解析form表单提交数据的时候使用FileUpload。但在最近的项目中出现了数据解析不成功的问题。 问题如题,造成这个问题的根本原因是因为struts2对request对象进行了封装,由HttpServletRequest变成MultiPartRequestWrapper。导致`fileList = upload.parseRequest(request);`获取不到上传的对象所以List为空。 解决办法:
1. 更改拦截器
<filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
改成
<filter-mapping> <filter-name>struts2</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping>
拦截后缀名可自行定义
2. 修改Struts的配置文件
剔除对Request的封装
步骤:
a)编写类文件 继承类JakartaMultiPartRequest
eg:
public class RequestParseWrapper extends JakartaMultiPartRequest { public void parse(HttpServletRequest servletRequest, String saveDir)throws IOException {} }
让该类生效
在struts.xml(Struts的配置文件,具体名字按照自己项目定义)添加以下内容:
如果struts2的版本是status2.3.4
在配置文件struts.xml里加上
<bean type= "org.apache.struts2.dispatcher.multipart.MultiPartRequest" name= "myRequestParser" class= "类所在的包路径.RequestParseWrapper" scope= "default" optional= "true " /> <constant name= "struts.multipart.handler" value= "myRequestParser" />
如果struts的版本是struts2.3.15.1 以后的版本
在配置文件struts.xml里加上
<bean type= "org.apache.struts2.dispatcher.multipart.MultiPartRequest" name= "myRequestParser" class= "类所在的包路劲.RequestParseWrapper" scope= "default" optional= "true " /> <constant name= " struts.multipart.parser" value= "myRequestParser" />
3. 使用MultiPartRequestWrapper
作为struts更新了如此多的版本,依然没有修复这个问题。具体原因我也不清楚,只是提出解决方案。
下面给出详细代码:
jsp页面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE html> <html> <!--[if IE 6]><html class="ie ie6"><![endif]--> <!--[if IE 7]><html class="ie ie7"><![endif]--> <!--[if IE 8]><html class="ie ie8"><![endif]--> <!--[if IE 9]><html class="ie ie9"><![endif]--> <!--[if gt IE 9]><html> <![endif]--> <head> <base href="<%=basePath%>"> <meta charset="UTF-8"> <meta name="renderer" content="webkit"> <meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible"> <meta content="width=device-width; initial-scale=1; maximum-scale=1" name="viewport"> <title>发送通知</title> </head> <body> <form enctype="multipart/form-data" name="filesend" id="file-form"> 通知标题:<input name="title" type="text" class="title"><br> 通知内容:<textarea rows="10%" cols="50%" name="content" class="content"></textarea><br> <a href="javascript:;" onclick="javascript:addfile();" class="add-file">添加附件</a> <div class="ext-file"></div> </form> <div class="modal-footer"> <button class="btn btn-primary" onclick="javascript:subimtBtn();">提交</button> </div> <script type="text/javascript" src="js/jquery.min.js"></script> <script type="text/javascript" src="js/jquery.form.js"></script> <script src="js/plugins/layer/layer.min.js"></script> <script type="text/javascript"> function addfile(){ var br = $("<br>"); var input = $("<input type='file' name='file' />"); var af = $("<a type='button' name='remove' >移除</a>"); $(".ext-file").append(br).append(input).append(af); af.click(function() { br.remove(); input.remove(); af.remove(); }); }; function subimtBtn() { var title=""; title = $(".title").val(); if(title==""){ layer.msg("标题不能为空!"); return false; } var content=""; content = $(".content").val(); if(content==""){ layer.msg("内容不能为空!"); return false; } var ajax_option={ type: "post", url:"<%=basePath%>/message/notice!getMesg.ac", dataType: "json", success:function(data){ console.log(data) } } $('#file-form').ajaxSubmit(ajax_option); return ; } </script> </body> </html>
Action方法:
private static final List<String> FILEEXT = Arrays.asList("xls", "xlsx", "doc","docx","jpg","gif","png");//允许的文件格式 private static SimpleDateFormat DF = new SimpleDateFormat("ddHHmmss");//重新格式化的文件名 private static final int FILESIZE = 5*1024*1024;//单个文件最大5M private String getFileDir(){ if(FILEDIR.isEmpty()){ FILEDIR = getFilepath()+"/upload"; } return FILEDIR; } private String getFilepath(){ if(FILEPATH.isEmpty()){ String classPath = NoticeAction.class.getClassLoader().getResource("/").getPath(); String rootPath = ""; if("\\".equals(File.separator)){//windows下 rootPath = classPath.substring(1,classPath.indexOf("/WEB-INF/classes")); FILEPATH = rootPath.replace("/", "\\"); }else if("/".equals(File.separator)){//linux下 rootPath = classPath.substring(0,classPath.indexOf("/WEB-INF/classes")); FILEPATH = rootPath.replace("\\", "/"); } } return FILEPATH; } public void getMesg()throws Exception{ try { if (ServletFileUpload.isMultipartContent(request())) { MultiPartRequestWrapper wrapper = (MultiPartRequestWrapper) request(); String[] filanames = wrapper.getFileNames("file");//所有的文件名 File[] files = wrapper.getFiles("file");//上传的所有文件 String title = String.valueOf(wrapper.getAttribute("title")); if (!new File(getFileDir()).isDirectory()){//文件夹上传目录 new File(getFileDir()).mkdirs(); } for(int i=0;i<files.length;i++){ File file = files[i]; String fileName = filanames[i]; //检查文件大小 if(file.length() > FILESIZE){ WriterJson(false, "", "操作失败:文件"+fileName+"大小超出最大限度!"); return ; } //检查扩展名 String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase(); if(!FILEEXT.contains(fileExt)){ WriterJson(false, "", "操作失败:文件格式不正确"); return; } String newFileName = fileName+"_"+DF.format(new Date()) + "_" + new Random().nextInt(1000) +i+ "." + fileExt;//重命名文件名 try { InputStream in = new FileInputStream(file); File uploadFile = new File(getFileDir(), newFileName); OutputStream out = new FileOutputStream(uploadFile); byte[] buffer = new byte[1024 * 1024]; int length; while ((length = in.read(buffer)) > 0) { out.write(buffer, 0, length); } in.close(); out.close(); } catch (FileNotFoundException ex) { ex.printStackTrace(); } catch (IOException ex) { ex.printStackTrace(); } } }else{ WriterJson(false, "", "类型不支持!"); } }catch (Exception e) { e.printStackTrace(); } WriterJson(true, "", "操作成功!"); }
其中WriterJson为项目封装的Ajax返回。
操作截图:
相关js文件如下:
jquery.form.js 自己上传,可自行搜索下载
layer.min.js 请移步官网下载
相关文章推荐
- 在ASP.NET 2.0中操作数据之五十二:使用FileUpload上传文件
- FileUpload 控件禁止手动输入的方法
- JS上传组件FileUpload自定义模板的使用方法
- FileUpload 控件 禁止手动输入或粘贴的实现代码
- struts2 jquery 打造无限层次的树
- 使用struts2+Ajax+jquery验证用户名是否已被注册
- struts2入门Demo示例
- 通过Ajax两种方式讲解Struts2接收数组表单的方法
- SSH框架网上商城项目第7战之整合Struts2和Json
- Struts2+Hibernate实现数据分页的方法
- ajax交互Struts2的action(客户端/服务器端)
- C#中的FileUpload 选择后的预览效果具体实现
- struts2 spring整合fieldError问题
- Struts2的s:radio标签使用及用jquery添加change事件
- FileUpload上传图片(图片不变形)
- 使用MyEclipse 开发struts2框架实现登录功能(结构教程)
- struts2 中文乱码的解决办法分享
- Struts2访问servlet分享
- struts2单个文件上传的两种实现方式
- struts2+jsp实现文件上传的方法