@MultipartConfig不';无法在Struts2控制器/操作上工作,Servlet 3.0部分。getpart(“文件”)为空
一些更新: 我有一些线索。 答案如下: 请求实例只能解析一次 我在处理请求时找到了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以前会处理请求。这是问题吗@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
我正在从事Struts2 Restful项目。有一个文件上传api接收文件和参数。我的问题是HttpServletRequest.getPart(“文件名”)总是返回null 环境是
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" />