I am implementing Struts2 File Upload using Ajax; I have added the jquery code as below
$("#btnUploadAttach").click(function () {
alert("Uploading your file");
//stop submit the form, we will post it manually.
event.preventDefault();
// Get form
var form = $('#fileUploadForm')[0];
// Create an FormData object
var data = new FormData(form);
alert("Uploading your file" + data);
$.ajax({
type: 'POST',
enctype: 'multipart/form-data',
data: data,
contentType: false,
processData: false,
cache: false,
timeout: 600000,
url: "/Dashboard/UploadFile.action",
success: function (data) {
alert("file saved successfully");
}
});
});
Also Please find the below code of JSP :
<s:form id="fileUploadForm" enctype="multipart/form-data" method="POST">
<div class="col-md-12">
<s:label for="CashReqFileUpload">Select Your File:</s:label>
</div>
<div class="col-md-12">
<div class="col-md-4">
<s:file name="CashReqFileUpload" id="CashReqFileUpload"/>
</div>
<div class="col-md-4"><input type="submit" value="Upload Document" id="btnUploadAttach" ></div>
<div class="col-md-4">
<button id="btnPrint" class="btn btn-success">Print</button>
</div>
</div>
</s:form>
And my action class as below :
private File CashReqFileUpload;
private String CashReqFileUploadFileName;
private String CashReqFileUploadContentType;
private String destPath;
public String execute(){
return SUCCESS;
}
public String uploadFileOnServer() throws IOException {
destPath = "D:/Temp/";
System.out.println("CashReqFileUpload File name: " + CashReqFileUpload);
System.out.println("CashReqFileUploadFileName File name: " + CashReqFileUploadFileName);
System.out.println("destPath File Name : "+destPath);
File destFile = new File(destPath, CashReqFileUploadFileName);
FileUtils.copyFile(CashReqFileUpload, destFile);
return SUCCESS;
}
public File getCashReqFileUpload() {
return CashReqFileUpload;
}
public void setCashReqFileUpload(File CashReqFileUpload) {
this.CashReqFileUpload = CashReqFileUpload;
}
public String getCashReqFileUploadFileName() {
return CashReqFileUploadFileName;
}
public void setCashReqFileUploadFileName(String CashReqFileUploadFileName) {
this.CashReqFileUploadFileName = CashReqFileUploadFileName;
}
public String getCashReqFileUploadContentType() {
return CashReqFileUploadContentType;
}
public void setCashReqFileUploadContentType(String CashReqFileUploadContentType) {
this.CashReqFileUploadContentType = CashReqFileUploadContentType;
}
I have tried with Serialize(), but it didn't workout, I found one solution on https://www.mkyong.com/jquery/jquery-ajax-submit-a-multipart-form/ to implement using Ajax. It is giving me NullPointerException as below :
Severe: java.lang.NullPointerException
at java.io.File.<init>(File.java:317)
at com.ISG.CIA.CTI.operations.UploadFile.uploadFileOnServer(UploadFile.java:35)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at ognl.OgnlRuntime.invokeMethod(OgnlRuntime.java:899)
at ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.java:1544)
at ognl.ObjectMethodAccessor.callMethod(ObjectMethodAccessor.java:68)
at com.opensymphony.xwork2.ognl.accessor.XWorkMethodAccessor.callMethodWithDebugInfo(XWorkMethodAccessor.java:96)
at com.opensymphony.xwork2.ognl.accessor.XWorkMethodAccessor.callMethod(XWorkMethodAccessor.java:88)
at ognl.OgnlRuntime.callMethod(OgnlRuntime.java:1620)
at ognl.ASTMethod.getValueBody(ASTMethod.java:91)
at ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212)
at ognl.SimpleNode.getValue(SimpleNode.java:258)
at ognl.Ognl.getValue(Ognl.java:470)
at ognl.Ognl.getValue(Ognl.java:434)
at com.opensymphony.xwork2.ognl.OgnlUtil$3.execute(OgnlUtil.java:371)
at com.opensymphony.xwork2.ognl.OgnlUtil.compileAndExecuteMethod(OgnlUtil.java:423)
at com.opensymphony.xwork2.ognl.OgnlUtil.callMethod(OgnlUtil.java:369)
at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:436)
at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:291)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:252)
at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:253)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:176)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:260)
at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:52)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.doIntercept(ConversionErrorInterceptor.java:139)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:134)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:134)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:199)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:69)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
at org.apache.struts2.interceptor.DateTextFieldInterceptor.intercept(DateTextFieldInterceptor.java:115)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:88)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:246)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:99)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:139
Severe: hain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:200)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:132)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:111)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:536)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:591)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:571)
at java.lang.Thread.run(Thread.java:744)
I want to implement file upload using Struts and Ajax only. Not using with any other plugin. I searched on StackOverflow, but their solution is not what my requirement is.
EDIT
Uploading Struts.xml :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<constant name="struts.ui.theme" value="simple"/>
<constant name="struts.custom.i18n.resources" value="operationProp.OperationalProp" />
<package name = "CTI" extends = "struts-default">
<interceptors>
<interceptor-stack name="modelParamsPrepareParamsStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="multiselect"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="params">
<param name="excludeParams">^dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,^parameters\..*,^action:.*,^method:.*</param>
</interceptor-ref>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="chain"/>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="actionMappingParams"/>
<interceptor-ref name="params">
<param name="excludeParams">^dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,^parameters\..*,^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-stack>
</interceptors>
<action name = "OnLoadAction"
class = "com.ISG.CIA.CTI.CashRequestManagement"
method = "execute">
<result name = "success">/ApprovedHistory.jsp</result>
</action>
<action name = "OnClickOfCreateNewReq"
class = "com.ISG.CIA.CTI.CashRequestManagement"
method = "getCashReqDataForNewReq">
<result name = "success">/CashRequestForm.jsp</result>
</action>
<action name = "onLoadForm"
class = "com.ISG.CIA.CTI.CashRequestManagement"
method = "getCashReqDataForSavedRequest">
<result name = "success">/CashRequestForm.jsp</result>
</action>
<action name = "OnClickOfSaveRequest"
class = "com.ISG.CIA.CTI.CashRequestManagement"
method = "SaveCashRequest">
<result name = "success">/CashRequestForm.jsp</result>
</action>
<action name="CashReqRej"
class="com.ISG.CIA.CTI.CashRequestManagement"
method="cancelCashReq">
<result name="success">/CashRequestForm.jsp</result>
</action>
<action name="CashReqApprove"
class="com.ISG.CIA.CTI.CashRequestManagement"
method="approveCashReq">
<result name="success">/CashRequestForm.jsp</result>
</action>
<action name="UploadFile"
class="com.ISG.CIA.CTI.operations.UploadFile"
method="uploadFileOnServer">
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="basicStack"/>
<result name="none">/CashRequestForm.jsp</result>
</action>
</package>
May be struts.xml may help to identify the issue.