1

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.

3

1 Answer 1

0

Try file upload interceptor before other like

<action name="UploadFile" 
        class="com.ISG.CIA.CTI.operations.UploadFile" 
        method="uploadFileOnServer">
    <interceptor-ref name="fileUpload"/>
    <interceptor-ref name="modelDriven"/>  
    <interceptor-ref name="defaultStack"/>  
    <interceptor-ref name="basicStack"/> 
    <result name="none">/CashRequestForm.jsp</result>
</action>
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.