如何使用OFBIZ将文件从客户端上传到服务器?

时间:2010-12-22 04:49:13

标签: java ofbiz

我在ofbiz/hot-deploy文件夹中创建了一个项目productionmgntSystem。在文件夹ofbiz\hot-deploy\productionmgntSystem\webapp\productionmgntSystem内,我创建了一个.ftl文件,即app_details_1.ftl。以下是此文件的代码

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

文件“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"/> 
................
.............
.............

以下是文件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);
    }
}

我想将文件上传到服务器。该文件来自<input type="file"..>文件&amp;中的用户app_details_1.ftl标记。它使用类testingService(HttpServletRequest request, HttpServletResponse response)中的方法WebServices1更新到服务器中。但是文件没有上传。

2 个答案:

答案 0 :(得分:2)

我得到了我的问题的解决方案。我成功将文件上传到服务器。这个解决方案是我在与ofbiz.I进行了一场大战之后得到的。我的旧编码做了一些改动。下面给出了。

以下是“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>

这是我在表单操作属性中的主要更改。

以下是“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"/>
...........
............

这里我应该将请求“uploadAttachFile”映射到事件“uploadFile”。这个事件在类“org.ofbiz.productionmgntSystem.web_app_req.Uploading”中调用方法“uploadFile”。这个类是由我定义的。实际上文件uplaod在ofbiz我只是复制编码&amp;改变了我的申请的一些变化。

在方法“uploadFile”中,我编写了将文件上传到服务器的编码。   我将类“org.ofbiz.productionmgntSystem.web_app_req.Uploading”存储在以下文件夹“ofbiz \ hot-deploy \ productionmgntSystem \ src \ org \ ofbiz \ productionmgntSystem \ web_app_req”中。这里的“productionmgntSystem”是我的应用程序名称。

以下是“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
    }
}

现在我的应用程序可以将文件上传到服务器。

答案 1 :(得分:0)

如果您不想用ftl编写并希望以简单的形式编写,那么这是我的代码。但首先让我感谢SIVAKUMAR.J让我走上正轨。

这是表单的代码:

   <request-map uri="uploadFileJava">
    <security https="true" auth="true"/>
    <event type="java" path="com.ofbiz.attendance.Uploading" invoke="uploadFile"/>
   </request-map>
<view-map name="AttachmentError" type="screen" page="component://yourComponentName/widget/yourComponentNameScreens.xml#main"/>

然后在controller.xml中

package com.ofbiz.attendance;
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
}


}

在项目的此路径中创建ant缺少文件夹:yourComponentFolder / src / ofbiz / attendance / 然后创建Uploading.java

Tensor

这是复制具有相同名称的文件,它们应该直接工作:)我希望这可以节省一些人的时间。 注:您不需要创建XML服务。