2012-03-26 4 views
0

Als ich Struts2 verwendet, um eine Datei hochzuladen, klickte ich in jsp submit, aber Tomcat zeigte mir die falsche Nachricht, ich habe im Internet gesucht, aber ich kann die Antwort nicht finden, also hoffe ich, dass mir jemand helfen kann, danke!Hochladen einer Datei mit Struts2 (der Webserver, den ich benutze ist Tomcat 7)

die falsche Botschaft ist unter:

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) 

Anmerkung Der vollständige Stack-Trace von der Ursache ist in den Apache Tomcat/7.0.26 Protokolle zur Verfügung. Apache Tomcat/7.0.26

die struts.xml ist:

<?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> 

die upLoadAction.java ist:

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

Sieht so aus, als könnte die Datei nicht gefunden werden. Kann ich Ihr Aktions-Mapping auf struts.xml und JAVA sehen? – batbaatar

+0

möchte diesen Teil sehen 'lanxiaoxing.upload.upLoadAction.execute (upLoadAction.java:58)' –

Antwort

0

Fileupload Verwendung Struts2 und fehlt der fileUpload und defaultStack abfangen Oder scheint den Fehler zu verursachen. Versuchen Sie, Ihre Aktion-Erklärung zu ändern wie:

<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> 

Auch SUCCESS ist eigentlich ein String "success" das ist, warum ich das Ergebnis-Namen in Kleinbuchstaben geändert. Beim Lernen ist es immer gut, eine tutorial zu folgen.

+1

Der Standard-Stack enthält bereits den Upload-Interceptor. –

1

Ihre Getter- und Setter-Namen sind alle falsch; sie sollten normale Java Namenskonventionen folgen, und das von dem Datei-Upload-Abfangjäger erwartet Konventionen, z.B .:

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

Dies setzt voraus, eine Datei Eingabefeld mit dem Namen „lanxiaoxinfile“.

IMO der "file" Teil dieses Variablennamens ist redundant.

Weitere Informationen finden Sie unter file upload docs.

Auch, wie Tusar sagt, sollte der Name des Ergebnisses "success" Kleinbuchstabe sein, oder einfach leer gelassen, da das der Standardwert ist. Der Standardstack enthält jedoch bereits den Interceptor "fileUpload", sodass eine Neukonfiguration für diese Aktion redundant und irreführend wäre.

Ziehen Sie in Erwägung, die Dateikopie über eine Hilfsmethode auszuführen, oder verwenden Sie einfach einen der Commons IO file copy utilities.

+0

+1 für eine gute Bewertung! und ich hatte diese vorherige Antwort für zukünftige Besucher wieder rückgängig gemacht :) – tusar

Verwandte Themen