formfile fileupload java file-upload struts2 struts2-interceptors

java - fileupload - formfile struts2



NullPointerException al cargar un archivo (1)

Al subir un archivo, aparece el siguiente error:

Struts Problem Report Struts has detected an unhandled exception: Messages: File: java/io/File.java Line number: 317 Stacktraces java.lang.NullPointerException java.io.File.(File.java:317) example.uploadFile.execute(uploadFile.java:36) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.jav‌​a:43) java.lang.reflect.Method.invoke(Method.java:483)

index.jsp

<form action="upload" method="post" enctype="multipart/form-data"> <label for="myFile">Upload your file</label> <input type="file" name="myFile" /> <input type="submit" value="Upload"/> </form>

uploadFile.java

package example; import java.io.File; import org.apache.commons.io.FileUtils; import java.io.IOException; import com.opensymphony.xwork2.ActionSupport; public class uploadFile extends ActionSupport { private File myFile; private String myFileContentType; private String myFileFileName; private String destPath; public String execute() { destPath = "C://Program Files//Apache Software Foundation//Apache Tomcat 8.0.3//work"; try{ System.out.println("Src File name: " + myFile); System.out.println("Dst File name: " + myFileFileName); File destFile = new File(destPath, myFileFileName); FileUtils.copyFile(myFile, destFile); }catch(IOException e){ return ERROR; } return SUCCESS; } public File getMyFile() { return myFile;` } public void setMyFile(File myFile) { this.myFile = myFile; this the file which user selects to upload } public String getMyFileContentType() { return myFileContentType; content type of the uploading file } public void setMyFileContentType(String myFileContentType) { this.myFileContentType = myFileContentType;` } public String getMyFileFileName() { return myFileFileName; } public void setMyFileFileName(String myFileFileName) { this.myFileFileName = myFileFileName; } }

struts.xml

<struts> <include file="example.xml"/> <constant name="struts.devMode" value="true" /> <constant name="struts.multipart.maxSize" value="1000000" /> <!-- Configuration for the default package. --> <package name="default" extends="struts-default"> <action name="upload" class="example.uploadFile"> <interceptor-ref name="basicStack"/> <interceptor-ref name="fileUpload"> <param name="allowedTypes">image/jpeg,image/gif</param> </interceptor-ref> <result name="success">/success.jsp</result> <result name="error">/error.jsp</result> </action> </package> </struts>


Para que funcione correctamente, FileUpload Interceptor debe ejecutarse antes que otros Interceptores en basicStack ;

puedes verificarlo en struts-default.xml :

Ejemplo 1:

<!-- Sample file upload stack --> <interceptor-stack name="fileUploadStack"> <interceptor-ref name="fileUpload"/> <interceptor-ref name="basicStack"/> </interceptor-stack>

Ejemplo 2:

<interceptor-stack name="defaultStack"> <interceptor-ref name="exception"/> <interceptor-ref name="alias"/> <interceptor-ref name="servletConfig"/> <interceptor-ref name="i18n"/> <interceptor-ref name="prepare"/> <interceptor-ref name="chain"/> <interceptor-ref name="scopedModelDriven"/> <interceptor-ref name="modelDriven"/> <interceptor-ref name="fileUpload"/> <interceptor-ref name="checkbox"/> <interceptor-ref name="datetime"/> <interceptor-ref name="multiselect"/> <interceptor-ref name="staticParams"/> <interceptor-ref name="actionMappingParams"/> <interceptor-ref name="params"> <param name="excludeParams">^action:.*,^method:.*</param> </interceptor-ref> <interceptor-ref name="conversionError"/> <interceptor-ref name="validation"> <param name="excludeMethods">input,back,cancel,browse</param> </interceptor-ref> <interceptor-ref name="workflow"> <param name="excludeMethods">input,back,cancel,browse</param> </interceptor-ref> <interceptor-ref name="debugging"/> <interceptor-ref name="deprecation"/> </interceptor-stack>

A continuación, colóquelo manualmente antes de la declaración basicStack , o use una pila (el defaultStack , o el fileUploadStack ) e incluya el nombre del Interceptor antes del nombre del parámetro, por ejemplo:

<interceptor-ref name="defaultStack"> <param name="fileUpload.allowedTypes">image/jpeg,image/gif</param> </interceptor-ref>

o

<interceptor-ref name="fileUploadStack"> <param name="fileUpload.allowedTypes">image/jpeg,image/gif</param> </interceptor-ref>