Не удается загрузить файл CSV в базу данных Oracle с клиентского компьютера с помощью Java-сервлета - PullRequest
0 голосов
/ 27 октября 2011

Я пытаюсь загрузить файл CSV в базу данных Oracle с моего клиентского компьютера, используя URL-адрес, но я не могу загрузить.Когда я пытаюсь загрузить файл с моего компьютера (сервера), он загружается легко, но по той же ссылке, когда я пытаюсь запустить его на своем клиентском компьютере, загрузка невозможна.Это дает мне следующее исключение:

java.io.FileNotFoundException: C:\new_upload\BD_RMA_25_10_11.csv (The system cannot find the path specified)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:106)
at java.io.FileInputStream.<init>(FileInputStream.java:66)
at java.io.FileReader.<init>(FileReader.java:41)
at upload1.UploadOutOrder.service(UploadOutOrder.java:27)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1539)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98)
at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:330)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:174)
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:828)
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:725)
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1019)
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
at java.lang.Thread.run(Thread.java:662)

Это мой код сервлета:

    package upload1;   
    import java.io.BufferedReader; 
    import java.io.FileReader;
    import java.io.IOException;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.util.StringTokenizer;
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    public class UploadOutOrder extends HttpServlet {
        public void init(ServletConfig config) throws ServletException{
        super.init(config);
        System.out.println("The UploadOutOrder initiated.");
         }
        public void service(HttpServletRequest request, HttpServletResponse    response)         throws ServletException,IOException {
        String filecsv=request.getParameter("csvfile");
        Connection con=DBConnection1.getConnection();
        System.out.println("connection=----------->"+con);
        PreparedStatement pstmthdr=null;
        int rowshdr=0;
        BufferedReader brcsv=new BufferedReader(new FileReader(filecsv));
        System.out.println("reading the file");
        String strLineCsv="";
        String csvstr="";
        StringTokenizer stcsv=null;
        int lineNumberHdr=0;
        try{
            pstmthdr=con.prepareStatement("insert into Out_Table values (?)");
            System.out.println("statement executed");
            while((strLineCsv=brcsv.readLine())!=null){
                System.out.println("HEADERLINE"+strLineCsv);
                int i=1;
                if(!(lineNumberHdr==0)){
                    stcsv=new StringTokenizer(strLineCsv,",");
                    while(stcsv.hasMoreTokens()){
                        csvstr=stcsv.nextToken();
                        System.out.println("HeaderString: "+csvstr);
                        pstmthdr.setString(i++,csvstr);
                        System.out.println("below insertion");
                    }
                    rowshdr=pstmthdr.executeUpdate();
                    System.out.println(rowshdr+" rows updated.");
                }
                lineNumberHdr++;
            }
            System.out.println("not in detail");

            System.out.println("ps executed");

        }
        catch(Exception e){
            System.out.println(e.getMessage());
        }
        finally
        {
            try {
                con.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        response.sendRedirect("http://ipaddress:8080/InvenApplication/success1.jsp");
    }
}

Как возникает эта проблема и как я могу ее решить?

1 Ответ

1 голос
/ 27 октября 2011

Вы использовали браузер MSIE, в котором есть ошибка, при которой он отправляет абсолютный путь к файлу вместо одного имени файла в <input type="file">. Вы на стороне сервера получаете абсолютный путь к файлу в качестве параметра и затем используете его для поиска файла в файловой системе диска на стороне сервера. Очевидно, это будет работать только тогда, когда и веб-сервер, и веб-браузер будут работать на физически на одной и той же машине.

Когда веб-сервер работает на физически другом компьютере, этот абсолютный путь к файлу не обязательно указывает на существующий файл в файловой системе локального диска компьютера. Если бы сервер мог получить доступ к файловой системе локального диска клиента, имея только абсолютный путь к файлу, то это было бы огромной дырой в безопасности! Каждый веб-сайт, который вы посещаете, сможет пускать в ход / манипулировать дисками посетителей сайта! Нет, к счастью это невозможно.

Вас не должен интересовать абсолютный путь загружаемого файла, так как он находится на стороне клиента. Вы скорее должны быть заинтересованы в загруженном файле content . Чтобы получить содержимое файла, вы должны убедиться, что тип кодировки HTML <form> установлен следующим образом:

<form action="upload" method="post" enctype="multipart/form-data">

Таким образом, вы можете использовать Apache Commons FileUpload в сервлете, чтобы получить содержимое файла как InputStream. Вы можете использовать InputStreamReader, чтобы украсить его в Reader.

Смотри также:

...