解决Struts2 使用Common-FileUpload List为空的问题

通常我们在解析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返回。
操作截图:
解决Struts2 使用Common-FileUpload List为空的问题_第1张图片
相关js文件如下:
jquery.form.js 自己上传,可自行搜索下载
layer.min.js 请移步官网下载

你可能感兴趣的:(Struts2)