Search code examples
javaofbiz

How to Upload a file from client to server using OFBIZ?


I created a project inside the ofbiz/hot-deploy folder namely productionmgntSystem. Inside the folder ofbiz\hot-deploy\productionmgntSystem\webapp\productionmgntSystem I created a .ftl file namely app_details_1.ftl.The following is the code of this file

<html>

    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
        <title>Insert title here</title>
        <script TYPE="TEXT/JAVASCRIPT" language=""JAVASCRIPT">
            function uploadFile()
            {
                //alert("Before calling upload.jsp");
                window.location='<@ofbizUrl>testing_service1</@ofbizUrl>'

            }

        </script>
    </head>
        <!-- <form action="<@ofbizUrl>testing_service1</@ofbizUrl>" enctype="multipart/form-data" name="app_details_frm"> -->
        <form action="<@ofbizUrl>logout1</@ofbizUrl>" enctype="multipart/form-data" name="app_details_frm"> 
        <center style="height: 299px; ">
            <table border="0" style="height: 177px; width: 788px">
                <tr style="height: 115px; ">
                    <td style="width: 103px; ">
                    <td style="width: 413px; "><h1>APPLICATION DETAILS</h1>
                    <td style="width: 55px; ">
                </tr>
                <tr>
                    <td style="width: 125px; ">Application name : </td>
                    <td>
                        <input name="app_name_txt" id="txt_1" value=" " />
                    </td>
                </tr>
                <tr>
                    <td style="width: 125px; ">Excell sheet &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: </td>
                    <td>
                        <input type="file" name="filename"/>
                    </td>
                </tr>
                <tr>
                    <td>
                       <!-- <input type="button" name="logout1_cmd" value="Logout" onclick="logout1()"/> -->
                       <input type="submit" name="logout_cmd" value="logout"/>
                    </td>
                    <td>
                        <!-- <input type="submit" name="upload_cmd" value="Submit" /> -->
                        <input type="button" name="upload1_cmd" value="Upload" onclick="uploadFile()"/>
                    </td>                   
                </tr>
            </table>
        </center>
    </form>
</html>

the following coding is present in the file "ofbiz\hot-deploy\productionmgntSystem\webapp\productionmgntSystem\WEB-INF\controller.xml"

......
.......
........
<request-map uri="testing_service1">
            <security https="true" auth="true"/>            
            <event type="java" path="org.ofbiz.productionmgntSystem.web_app_req.WebServices1" invoke="testingService"/>
            <response name="ok" type="view" value="ok_view"/>
            <response name="exception" type="view" value="exception_view"/>         
        </request-map>
..........
............
..........
<view-map name="ok_view" type="ftl" page="ok_view.ftl"/>        
<view-map name="exception_view" type="ftl" page="exception_view.ftl"/> 
................
.............
.............

The following is the code in the file ofbiz\hot-deploy\productionmgntSystem\src\org\ofbiz\productionmgntSystem\web_app_req\WebServices1.java

package org.ofbiz.productionmgntSystem.web_app_req;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.DataInputStream;
import java.io.FileOutputStream;
import java.io.IOException;


public class WebServices1
{
    public static String testingService(HttpServletRequest request, HttpServletResponse response)
    {
        //int i=0;
        String result="ok";
        System.out.println("\n\n\t*************************************\n\tInside WebServices1.testingService(HttpServletRequest request, HttpServletResponse response)- Start");
        String contentType=request.getContentType();
        System.out.println("\n\n\t*************************************\n\tInside WebServices1.testingService(HttpServletRequest request, HttpServletResponse response)- contentType : "+contentType);
        String str=new String();
        // response.setContentType("text/html");
        //PrintWriter writer;
        if ((contentType != null) && (contentType.indexOf("multipart/form-data") >= 0))
        {
            System.out.println("\n\n\t**********************************\n\tInside WebServices1.testingService(HttpServletRequest request, HttpServletResponse response) after if (contentType != null)");
            try
            {
                // writer=response.getWriter();
                System.out.println("\n\n\t**********************************\n\tInside WebServices1.testingService(HttpServletRequest request, HttpServletResponse response) - try Start");
                DataInputStream in = new DataInputStream(request.getInputStream());
                int formDataLength = request.getContentLength();
                byte dataBytes[] = new byte[formDataLength];
                int byteRead = 0;
                int totalBytesRead = 0;

                //this loop converting the uploaded file into byte code
                while (totalBytesRead < formDataLength)
                {
                    byteRead = in.read(dataBytes, totalBytesRead,formDataLength);
                    totalBytesRead += byteRead;
                }

                String file = new String(dataBytes);
                //for saving the file name
                String saveFile = file.substring(file.indexOf("filename=\"") + 10);
                saveFile = saveFile.substring(0, saveFile.indexOf("\n"));
                saveFile = saveFile.substring(saveFile.lastIndexOf("\\")+ 1,saveFile.indexOf("\""));
                int lastIndex = contentType.lastIndexOf("=");
                String boundary = contentType.substring(lastIndex + 1,contentType.length());
                int pos;

                //extracting the index of file
                pos = file.indexOf("filename=\"");
                pos = file.indexOf("\n", pos) + 1;
                pos = file.indexOf("\n", pos) + 1;
                pos = file.indexOf("\n", pos) + 1;
                int boundaryLocation = file.indexOf(boundary, pos) - 4;
                int startPos = ((file.substring(0, pos)).getBytes()).length;
                int endPos = ((file.substring(0, boundaryLocation)).getBytes()).length;

                //creating a new file with the same name and writing the content in new file
                FileOutputStream fileOut = new FileOutputStream("/"+saveFile);
                fileOut.write(dataBytes, startPos, (endPos - startPos));
                fileOut.flush();
                fileOut.close();
                System.out.println("\n\n\t**********************************\n\tInside WebServices1.testingService(HttpServletRequest request, HttpServletResponse response) - try End");
            }
            catch(IOException ioe)
            {
                System.out.println("\n\n\t*********************************\n\tInside WebServices1.testingService(HttpServletRequest request, HttpServletResponse response) - Catch IOException");
                //ioe.printStackTrace();
                return("exception");
            }
            catch(Exception ex)
            {
                System.out.println("\n\n\t*********************************\n\tInside WebServices1.testingService(HttpServletRequest request, HttpServletResponse response) - Catch Exception");
                return("exception");
            }
        }
        else
        {
            System.out.println("\n\n\t********************************\n\tInside WebServices1.testingService(HttpServletRequest request, HttpServletResponse response) else part");
            result="exception";
        }
        System.out.println("\n\n\t*************************************\n\tInside WebServices1.testingService(HttpServletRequest request, HttpServletResponse response)- End");
        return(result);
    }
}

I want to upload a file to the server.The file is get from user <input type="file"..> tag in the app_details_1.ftl file & it is updated into the server by using the method testingService(HttpServletRequest request, HttpServletResponse response) in the class WebServices1. But the file is not uploaded.


Solution

  • I got the solution to my problem.I successfully upload the file into the server.This solution i get after the big fight with ofbiz.I made a little changes in my old coding.That is given below.

    the following are the coding present in the "app_details_1.ftl"

    <html>
    
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    
            <!--<meta http-equiv="Content-Type" content="multipart/form-data; charset=ISO-8859-1">-->
    
            <title>Insert title here</title>
            <script TYPE="TEXT/JAVASCRIPT" language=""JAVASCRIPT">
                function uploadFile()
                {
                    //alert("Before calling upload.jsp");
                    window.location='<@ofbizUrl>testing_service1</@ofbizUrl>'
    
                }
    
                function logout1()
                {
                    //alert("Logout1");
                    alert("<@ofbizUrl>logout1</@ofbizUrl>");
                    window.location='<@ofbizUrl>logout1</@ofbizUrl>'
                }
            </script>
            </head>
            <!-- <form action="<@ofbizUrl>testing_service1</@ofbizUrl>" enctype="multipart/form-data" name="app_details_frm"> -->
            <body bgcolor="cyan">
                <form enctype="multipart/form-data" action="<@ofbizUrl>uploadAttachFile</@ofbizUrl>" METHOD=POST>
                    <center style="height: 299px;">
                        <table border="0" style="height: 177px; width: 788px">
                            <tr style="height: 115px; ">
                                <td style="width: 103px; ">
                                <td style="width: 440px; "><h1>APPLICATION DETAILS</h1>
                                <td style="width: 55px; ">
                            </tr>
                            <tr>
                                <td style="width: 125px; ">Application name : </br></td>
                                <td>
                                    <input name="app_name_txt" id="txt_1" value=" " />
                                </td>
                                <td></br></br></td>
                            </tr>
                            <tr>
                                <td style="width: 125px; ">Excell sheet &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: </td>
                                <td>
                                    <input type="file" name="filename"/>
                                </td>
                                <td></br></br></td>
                            </tr>
                            <tr>
                                <td>
                                <td></br>
                                <td>
                            </tr>
                            <tr>
                                <td>
                                   <input type="button" name="logout1_cmd" value="LOGOUT" onclick="logout1()"/>
                                  <!-- <input type="submit" name="logout_cmd" value="logout"/>-->
                                </td>
                                <td>
                                    <input type="submit" name="upload_cmd" value="UPLOAD" />
                                    <!-- <input type="button" name="upload1_cmd" value="Upload" onclick="uploadFile()"/> -->
                                </td>
                            </tr>
                        </table>
                    </center>
                </form>
            </body>
    </html>
    

    Here my main changes in the form action attribute.

    The following are the coding snippet in "controller.xml"

    ...............
    .............
    <request-map uri="uploadAttachFile">
                <security https="true" auth="true"/>
               <!--  <event type="simple" invoke="createCommunicationContent" path="component://productionmgntSystem/script/org/ofbiz/productionmgntSystem/CommunicationEventEvents.xml"/>  -->
    
               <event type="java" path="org.ofbiz.productionmgntSystem.web_app_req.Uploading" invoke="uploadFile"/>
    
                <response name="AttachementSuccess" type="view" value="AttachementSuccess"/>
                <response name="AttachementException" type="view" value="AttachementException"/>
            </request-map>    
    ................
    .....................
    <view-map name="AttachmentError" type="ftl" page="file_attach_error.ftl"/>
    <view-map name="AttachementException" type="ftl" page="file_attach_error.ftl"/>
    <view-map name="AttachementSuccess" type="ftl" page="AttachementSuccess.ftl"/>
    ...........
    ............
    

    Here i should map a request "uploadAttachFile" to the event "uploadFile".That is this event call the method "uploadFile" inside the class "org.ofbiz.productionmgntSystem.web_app_req.Uploading".This class is defined by me.Actually file uplaod is there in ofbiz i just copy the coding & altered some changes for my application.

    Inside the method "uploadFile" is i write the coding for uploading the file into server. I stored the class "org.ofbiz.productionmgntSystem.web_app_req.Uploading" in the following folder "ofbiz\hot-deploy\productionmgntSystem\src\org\ofbiz\productionmgntSystem\web_app_req". Here the "productionmgntSystem" is the my application name.

    The following are coding present inside the class "org.ofbiz.productionmgntSystem.web_app_req.Uploading"

    //UPLOADING A CONTENT TO THE SERVER
    
    package org.ofbiz.productionmgntSystem.web_app_req;
    
    import java.io.File;
    import java.io.IOException;
    import java.nio.ByteBuffer;
    import java.io.FileOutputStream;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.apache.commons.fileupload.FileItem;
    import org.apache.commons.fileupload.FileUploadException;
    import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    import org.apache.commons.fileupload.servlet.ServletFileUpload;
    import org.ofbiz.service.ServiceUtil;
    import java.util.List;
    
    public class Uploading
    {
        public static String uploadFile(HttpServletRequest request,HttpServletResponse response)
        {
            //ServletFileUpload fu = new ServletFileUpload(new DiskFileItemFactory(10240, new File(new File("runtime"), "tmp")));           //Creation of servletfileupload
            System.out.println("\n\n\t****************************************\n\tuploadFile(HttpServletRequest request,HttpServletResponse response) - start\n\t");
            ServletFileUpload fu = new ServletFileUpload(new DiskFileItemFactory());           //Creation of servletfileupload
            java.util.List lst = null;
            String result="AttachementException";
            String file_name="";
            try 
            {
                lst = fu.parseRequest(request);
            }
            catch (FileUploadException fup_ex) 
            {
                System.out.println("\n\n\t****************************************\n\tException of FileUploadException \n\t");
                fup_ex.printStackTrace();
                result="AttachementException";
                return(result);
            }
    
            if(lst.size()==0)        //There is no item in lst
            {
                System.out.println("\n\n\t****************************************\n\tLst count is 0 \n\t");
                result="AttachementException";
                return(result);
            }
    
    
            FileItem file_item = null;
            FileItem selected_file_item=null;
    
            //Checking for form fields - Start
                for (int i=0; i < lst.size(); i++) 
                {
                    file_item=(FileItem)lst.get(i);
                    String fieldName = file_item.getFieldName();
    
                    //Check for the attributes for user selected file - Start
                        if(fieldName.equals("filename"))
                        {
                            selected_file_item=file_item;
                            //String file_name=file_item.getString();                       
                            //file_name=request.getParameter("filename");
                            file_name=file_item.getName();             //Getting the file name
                            System.out.println("\n\n\t****************************************\n\tThe selected file item's file name is : "+file_name+"\n\t");
                            break;
                        }
                    //Check for the attributes for user selected file - End
                }
            //Checking for form fields - End
    
            //Uploading the file content - Start
                if(selected_file_item==null)                    //If selected file item is null
                {
                    System.out.println("\n\n\t****************************************\n\tThe selected file item is null\n\t");
                    result="AttachementException";
                    return(result);
                }
    
                byte[] file_bytes=selected_file_item.get();
                byte[] extract_bytes=new byte[file_bytes.length];
    
                for(int l=0;l<file_bytes.length;l++)
                    extract_bytes[l]=file_bytes[l];
                //ByteBuffer byteWrap=ByteBuffer.wrap(file_bytes);
                //byte[] extract_bytes;
                //byteWrap.get(extract_bytes);
    
    
                //System.out.println("\n\n\t****************************************\n\tExtract succeeded :content are : \n\t");
    
    
                if(extract_bytes==null)
                {
                    System.out.println("\n\n\t****************************************\n\tExtract bytes is null\n\t");
                    result="AttachementException";
                    return(result);
                }
    
                /*
                for(int k=0;k<extract_bytes.length;k++)
                    System.out.print((char)extract_bytes[k]);
                */
    
                //String target_file_name="/hot-deploy/productionmgntSystem"
                //Creation & writing to the file in server - Start              
                    try
                    {
                        FileOutputStream fout=new FileOutputStream(file_name);
                        System.out.println("\n\n\t****************************************\n\tAfter creating outputstream");
                        fout.flush();
                        fout.write(extract_bytes);
                        fout.flush();
                        fout.close();
                    }
                    catch(IOException ioe_ex)
                    {
                        System.out.println("\n\n\t****************************************\n\tIOException occured on file writing");
                        ioe_ex.printStackTrace();
                        result="AttachementException";
                        return(result);
                    }
                //Creation & writing to the file in server - End
    
                System.out.println("\n\n\t****************************************\n\tuploadFile(HttpServletRequest request,HttpServletResponse response) - end\n\t");
                return("AttachementSuccess");
            //Uploading the file content - End
        }
    }
    

    Now in my application im able to upload the file into the server.