@MultipartConfig不';无法在Struts2控制器/操作上工作,Servlet 3.0部分。getpart(“文件”)为空

@MultipartConfig不';无法在Struts2控制器/操作上工作,Servlet 3.0部分。getpart(“文件”)为空,struts2,multipartform-data,Struts2,Multipartform Data,一些更新: 我有一些线索。 答案如下: 请求实例只能解析一次 我在处理请求时找到了struts日志: 2015-11-05 12:23:58917:DEBUG com.opensymphony.xwork2.interceptor.parameters接收器-设置参数data=>[/Users/zhoum/Documents/tools/apache-tomcat-7.0.55/work/Catalina/localhost/nemo-upload-service/upload\u b4a8ce

一些更新:

我有一些线索。 答案如下:

请求实例只能解析一次 我在处理请求时找到了struts日志:

2015-11-05 12:23:58917:DEBUG com.opensymphony.xwork2.interceptor.parameters接收器-设置参数data=>[/Users/zhoum/Documents/tools/apache-tomcat-7.0.55/work/Catalina/localhost/nemo-upload-service/upload\u b4a8ce33\u 67cf\u 482f\u 9798\u 0985ff974c60\u 00000001.tmp]dataContentType=>[text/plain]dataFileName=>[test.txt]id=>[1]

所以我担心struts以前会处理请求。这是问题吗


我正在从事Struts2 Restful项目。有一个文件上传api接收文件和参数。我的问题是HttpServletRequest.getPart(“文件名”)总是返回null

环境是

  • 作为内容类型的多部分/表单数据
  • Tomcat7
  • Servlet 3.0.1
  • JDK1.6
  • 我的代码:

    package nz.co.niwa.nemo.uploadservice.web.rest;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.Enumeration;
    import java.util.HashMap;
    import java.util.Map;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.MultipartConfig;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.Part;
    
    import org.apache.struts2.interceptor.ServletRequestAware;
    import org.apache.struts2.rest.DefaultHttpHeaders;
    import org.apache.struts2.rest.HttpHeaders;
    
    import com.opensymphony.xwork2.ModelDriven;
    
    @MultipartConfig(fileSizeThreshold=1024*1024, 
    maxFileSize=1024*1024*5, maxRequestSize=1024*1024*5*5)
    public class RequestController implements ModelDriven<Map<String, Object>>, ServletRequestAware {
    private HttpServletRequest request;
    private Map<String, Object> model;
    
    public HttpHeaders test() {
        getHttpRequestContent();
        return new DefaultHttpHeaders();
    }
    
    private void getHttpRequestContent() {
        model = new HashMap<String, Object>();
        model.put("http method", request.getMethod());
        model.put("content length", request.getContentLength());
        System.out.println(request.getContentType());
    
        // parts
        try {
            Part part = request.getPart("data");
            model.put("filename", getSubmittedFileName(part));
            BufferedReader in = new BufferedReader(new InputStreamReader(part.getInputStream()));
            String textString = in.readLine();
            // the first line
            model.put("content", textString);
        } catch (IOException e1) {
            e1.printStackTrace();
        } catch (ServletException e1) {
            e1.printStackTrace();
        }
    
        // params
        Map<String, Object> params = new HashMap<String, Object>();
        for(Enumeration<?> e = request.getParameterNames(); e.hasMoreElements();) {
            String paramName = (String)e.nextElement();
            params.put(paramName, request.getParameter(paramName));
        }
        model.put("params", params);
    }
    
    
    @Override
    public Map<String, Object> getModel() {
        return model;
    }
    
    @Override
    public void setServletRequest(HttpServletRequest request) {
        this.request = request;
    
    }
    
    private static String getSubmittedFileName(Part part) {
        for (String cd : part.getHeader("content-disposition").split(";")) {
            if (cd.trim().startsWith("filename")) {
                String fileName = cd.substring(cd.indexOf('=') + 1).trim().replace("\"", "");
                return fileName.substring(fileName.lastIndexOf('/') + 1).substring(fileName.lastIndexOf('\\') + 1); // MSIE fix.
            }
        }
        return null;
    }
    
    }
    
    包nz.co.niwa.nemo.uploadservice.web.rest;
    导入java.io.BufferedReader;
    导入java.io.IOException;
    导入java.io.InputStreamReader;
    导入java.util.Enumeration;
    导入java.util.HashMap;
    导入java.util.Map;
    导入javax.servlet.ServletException;
    导入javax.servlet.annotation.MultipartConfig;
    导入javax.servlet.http.HttpServletRequest;
    导入javax.servlet.http.Part;
    导入org.apache.struts2.interceptor.ServletRequestAware;
    导入org.apache.struts2.rest.DefaultHttpHeaders;
    导入org.apache.struts2.rest.HttpHeaders;
    导入com.opensymphony.xwork2.ModelDriven;
    @MultipartConfig(fileSizeThreshold=1024*1024,
    maxFileSize=1024*1024*5,maxRequestSize=1024*1024*5*5)
    公共类RequestController实现模型驱动的ServletRequestAware{
    私有HttpServletRequest;
    私有地图模型;
    公共HttpHeaders测试(){
    getHttpRequestContent();
    返回新的DefaultHttpHeaders();
    }
    私有void getHttpRequestContent(){
    model=newhashmap();
    put(“http方法”,request.getMethod());
    put(“content-length”,request.getContentLength());
    System.out.println(request.getContentType());
    //零件
    试一试{
    Part=request.getPart(“数据”);
    model.put(“文件名”,getSubmittedFileName(部分));
    BufferedReader in=新的BufferedReader(新的InputStreamReader(part.getInputStream());
    String textString=in.readLine();
    //第一行
    model.put(“内容”,textString);
    }捕获(IOE1异常){
    e1.printStackTrace();
    }捕获(ServletException e1){
    e1.printStackTrace();
    }
    //params
    Map params=新的HashMap();
    对于(枚举e=request.getParameterNames();e.hasMoreElements();){
    字符串paramName=(字符串)e.nextElement();
    params.put(paramName,request.getParameter(paramName));
    }
    模型放置(“参数”,参数);
    }
    @凌驾
    公共地图getModel(){
    收益模型;
    }
    @凌驾
    public void setServletRequest(HttpServletRequest请求){
    this.request=请求;
    }
    私有静态字符串getSubmittedFileName(部分){
    对于(字符串cd:part.getHeader(“内容处置”).split(;”){
    if(cd.trim().startsWith(“文件名”)){
    字符串fileName=cd.substring(cd.indexOf('=')+1.trim().replace(“\”,”);
    返回fileName.substring(fileName.lastIndexOf(“/”)+1)。substring(fileName.lastIndexOf(“\\”)+1);//MSIE修复。
    }
    }
    返回null;
    }
    }
    
    我的struts.xml

    <?xml version="1.0" encoding="utf-8"?>
    
    
    

    
    

    My web.xml

    <!DOCTYPE web-app PUBLIC
     "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
     "http://java.sun.com/dtd/web-app_2_3.dtd">
    
    <web-app>
        <display-name>Archetype Created Web Application</display-name>
    
        <!-- Spring configuration files location -->  
        <context-param>    
            <param-name>contextConfigLocation</param-name>   
            <param-value>classpath:spring/*</param-value>  
        </context-param>
    
        <!-- execution sequence:1. filter 2.servlet -->
        <!-- struts filter-->
        <filter>  
            <filter-name>struts2</filter-name>  
            <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>  
        </filter>  
        <filter-mapping>  
            <filter-name>struts2</filter-name>  
            <url-pattern>/*</url-pattern>  
        </filter-mapping>
    
        <!-- Spring listener -->  
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
        <!-- Servlet listener that exposes the request to the current thread, through both LocaleContextHolder and RequestContextHolder. -->
        <!-- e.g. request can get login users' name and role -->
        <listener>
            <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
        </listener>
    
        <security-constraint>
            <web-resource-collection>
                <web-resource-name>NEMO UPLOAD RESTFUL</web-resource-name>
                <!-- all resources under webapp/ folder are applied this rule  -->
                <url-pattern>/*</url-pattern>
            </web-resource-collection>
            <!-- JAAS security section -->
            <auth-constraint>
                <role-name>admin</role-name>
                <role-name>user</role-name>
            </auth-constraint>
            <!-- SSL -->
            <user-data-constraint>
                <!-- TODO CONFIDENTIAL -->
                <transport-guarantee>NONE</transport-guarantee>
            </user-data-constraint>
        </security-constraint>
        <login-config>
            <!-- Basic authentication, your browser will store the user credentials until it's closed.  -->
            <auth-method>BASIC</auth-method>
            <realm-name>NEMO upload service requires authentication.</realm-name>
        </login-config>
        <security-role>
            <role-name>admin</role-name>
        </security-role>
        <security-role>
            <role-name>user</role-name>
        </security-role>
    </web-app>
    
    
    Web应用程序创建的原型
    上下文配置位置
    类路径:spring/*
    支柱2
    org.apache.struts2.dispatcher.ng.filter.strutspreadexecutefilter
    支柱2
    /*  
    org.springframework.web.context.ContextLoaderListener
    org.springframework.web.context.request.RequestContextListener
    尼莫上传RESTFUL
    /*
    

    由于我的是struts restful控制器,因此我不知道如何处理这种情况。我尝试在struts.xml中添加一个常量:

    <constant name="struts.multipart.maxSize" value="30000000" />
    
    
    
    但还是不行

    我想提到的一件重要的事情是,我的服务器(tomcat)已经收到了这个文件,创建了一个临时文件。当我在eclipse中调试时,我检查了HttpServeletRequest实例,它有一个多私有值,其中包含一个名为“files”的值。我在那里找到了我的上传文件。 这是我在使用eclipse检查HttpServletRequest.multi.xml文件时看到的情况:

    {data=[name=test.txt,StoreLocation=/Users/zhoum/Documents/tools/apache-tomcat-7.0.55/work/Catalina/localhost/nemo-upload-service/upload_9dc69a88_ccfa_4ba1_9a8e_ae6912bb6d5c_00000001.tmp,大小=23字节,isFormField=false,FieldName=data]}


    @AleksandrM是的,这是我目前的解决方案,它确实有效。我希望struts2能够与servlet3+兼容。无论如何,谢谢!它是兼容的。如果你想自己处理多部分,那么你需要告诉S2不要管理它。嗨@AleksandrM,我能更清楚地告诉S2如何不管理http请求吗?提前谢谢!检查t他说:。
    <constant name="struts.multipart.maxSize" value="30000000" />