通常我们在解析form表单提交数据的时候使用FileUpload。但在最近的项目中出现了数据解析不成功的问题。
问题如题,造成这个问题的根本原因是因为struts2对request对象进行了封装,由HttpServletRequest变成MultiPartRequestWrapper。导致`fileList = upload.parseRequest(request);`获取不到上传的对象所以List为空。
解决办法:
1. 更改拦截器
<filter-mapping>
<filter-name>struts2filter-name>
<url-pattern>/*url-pattern>
filter-mapping>
改成
<filter-mapping>
<filter-name>struts2filter-name>
<url-pattern>*.actionurl-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里加上
type= "org.apache.struts2.dispatcher.multipart.MultiPartRequest"
name= "myRequestParser" class= "类所在的包路径.RequestParseWrapper"
scope= "default" optional= "true " />
"struts.multipart.handler" value= "myRequestParser" />
如果struts的版本是struts2.3.15.1 以后的版本
在配置文件struts.xml里加上
type= "org.apache.struts2.dispatcher.multipart.MultiPartRequest"
name= "myRequestParser" class= "类所在的包路劲.RequestParseWrapper"
scope= "default" optional= "true " />
" 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+"/";
%>
<html>
<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 = $("
");
var input = $("");
var af = $("移除");
$(".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 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//检查文件大小
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 请移步官网下载