2012-03-26 31 views
0

當我使用Struts2上傳文件時,我點擊了jsp提交,但是,tomcat向我顯示了錯誤信息,我在互聯網上搜索了,但我找不到答案,所以我希望有人能幫助我,謝謝!使用Struts2上傳文件(我使用的是Tomcat 7的Web服務器)

錯誤信息是如下:

HTTP Status 500 - 
type Exception report 
message 
description The server encountered an internal error() that prevented it from fulfilling this request. 
exception 
java.lang.NullPointerException 
java.io.FileInputStream.<init>(FileInputStream.java:134) 
lanxiaoxing.upload.upLoadAction.execute(upLoadAction.java:58) 
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
java.lang.reflect.Method.invoke(Method.java:601) 
com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:441) 
com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:280) 
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:243) 
com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:165) 
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) 
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) 
com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:252) 
org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68) 
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) 
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) 
com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:122) 
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) 
com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195) 
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) 
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) 
com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195) 
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) 
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) 
com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:179) 
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) 
org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75) 
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) 
org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94) 
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) 
org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:306) 
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) 
com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89) 
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) 
com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:130) 
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) 
org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267) 
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) 
com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126) 
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) 
com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138) 
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) 
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) 
com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:165) 
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) 
org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164) 
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) 
com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:179) 
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) 
com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176) 
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) 
org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52) 
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:488) 
org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77) 
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91) 

音符的根本原因的完整棧跟蹤可用在的Apache Tomcat/7.0.26日誌。 的Apache Tomcat/7.0.26

的struts.xml中是:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" 
    "http://struts.apache.org/dtds/struts-2.1.dtd"> 
<struts> 
<package name="lanxiaoxing.user" extends="struts-default"> 
<action name="loginUser" class="lanxiaoxing.user.userAction"> 
    <result name="success">success.jsp</result> 
    <result name="error">error.jsp</result> 
</action> 
</package> 
<package name="lanxiaoxing.upload" extends="struts-default"> 
<action name="upLoad" class="lanxiaoxing.upload.upLoadAction"> 
    <result name="SUCCESS">upload_success.jsp</result> 
</action> 
</package> 
</struts> 

的upLoadAction.java是:

package lanxiaoxing.upload; 

import java.io.*; 
import javax.servlet.http.*; 
import org.apache.struts2.*; 
import com.opensymphony.xwork2.*; 

public class upLoadAction extends ActionSupport{ 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 
private File lanxiaoxingfile; 
private String lanxiaoxingfileContentType; 
private String lanxiaoxingfileName; 
private String savePath; 


private String getSavePath(){ 
    HttpServletRequest request = ServletActionContext.getRequest(); 
    return request.getSession().getServletContext().getRealPath(savePath); 
} 


public File getlanxiaoxingfile(){ 
    return lanxiaoxingfile; 
} 
public void setlanxiaoxingfile(File lanxiaoxingfile){ 
    this.lanxiaoxingfile=lanxiaoxingfile; 
} 

public String getlanxiaoxingfileContentType(){ 
    return lanxiaoxingfileContentType; 
} 
public void setlanxiaoxingfileContenType(String lanxiaoxingfileContentType){ 
    this.lanxiaoxingfileContentType=lanxiaoxingfileContentType; 
} 

public String getlanxiaoxingfileName(){ 
    return lanxiaoxingfileName; 
} 
public void setlanxiaoxingfileName(String lanxiaoxingfileName){ 
    this.lanxiaoxingfileName=lanxiaoxingfileName; 
} 

public void setsavePath(String savePath){ 
    this.savePath=savePath; 
} 

public String execute() throws Exception{ 
    setsavePath(""); 

    FileOutputStream fos = new FileOutputStream(getSavePath()+"\\"+getlanxiaoxingfileName()); 

    FileInputStream fis = new FileInputStream(getlanxiaoxingfile()); 

    byte[]buffer = new byte[1024]; 
    int len=0; 
    while((len=fis.read(buffer))>0){ 
     fos.write(buffer, 0, len); 
    } 
    return SUCCESS; 
} 

}

+0

看起來像無法找到該文件。我可以在struts.xml和JAVA部分看到你的動作映射嗎? – batbaatar 2012-03-26 16:00:40

+0

希望看到這部分'lanxiaoxing.upload.upLoadAction.execute(upLoadAction.java:58)' – 2012-03-26 18:25:45

回答

0

文件上傳使用Struts2的和缺少fileUploaddefaultStack截距或似乎導致錯誤。試着改變你一樣行動聲明:

<action name="upLoad" class="lanxiaoxing.upload.upLoadAction"> 
    <interceptor-ref name="fileUpload"> 
     <param name="maximumSize">999999999999</param> 
     <param name="allowedTypes"> 
      image/png,image/gif,image/jpeg,image/pjpeg 
     </param> 
    </interceptor-ref> 
    <interceptor-ref name="defaultStack"></interceptor-ref> 
    <result name="success">upload_success.jsp</result> 
</action> 

此外,SUCCESS實際上是一個字符串"success"這就是爲什麼我修改的結果,名字小寫字母。 學習時,遵循tutorial總是很好。

+1

默認堆棧已經包含上傳攔截器。 – 2012-03-27 11:18:40

1

您的getter和setter名稱都不正確;他們應該遵循正常的Java命名約定,並通過文件上傳攔截預期的約定,例如:

public void setLanxiaoxingfile(File lanxiaoxingfile) { // Note capital "L" 

這是假定文件輸入字段名稱爲「lanxiaoxinfile」。

IMO變量名稱的"file"部分是多餘的。

查看file upload docs瞭解更多信息。

另外,正如tusar所說,結果名稱應該是小寫的"success",或者只是留空,因爲這是默認值。但是,默認堆棧已經包含了攔截器,因此爲此操作重新配置它將是多餘的和誤導性的。

考慮通過實用方法進行文件複製,或者只使用Commons IO file copy utilities之一。

+0

+1好評!我已經回覆了以前的答案,爲未來的訪客:) – tusar 2012-03-28 06:50:42

相關問題