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

解决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 请移步官网下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息