FileNotFoundException将图像上载到Oracle数据库

FileNotFoundException将图像上载到Oracle数据库,exception,servlets,filenotfoundexception,servletexception,ojdbc,Exception,Servlets,Filenotfoundexception,Servletexception,Ojdbc,我制作了一个servlet程序,将图像插入到Oracle数据库中。节目如下 import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.sql.Connection; import java.sql.DriverManager; import java.sql.

我制作了一个servlet程序,将图像插入到Oracle数据库中。节目如下

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class InsertImage extends HttpServlet {
    private static final long serialVersionUID = 1L;
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        String url=request.getParameter("image");
        File image=new File(url);
        FileInputStream fis;
        PrintWriter pw=response.getWriter();
        try
        {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            String str = "jdbc:oracle:thin:@localhost:1521:XE";
            Connection con = DriverManager.getConnection(str,"system","root");
            PreparedStatement pstmt=con.prepareStatement("insert into insertimage(image) values(?)");
            fis = new FileInputStream(image);
            pstmt.setBinaryStream(1, (InputStream)fis, (int)(image.length()));
            int size=pstmt.executeUpdate();
            if(size>0)
            {
                pw.println("<html>Image Uploaded Successfully.</html>");
            }
            else
            {
                pw.println("<html>Image could not be uploaded.</html>");
            }
        }
        catch(SQLException e)
        {
            e.printStackTrace();
        }
        catch(ClassNotFoundException e)
        {
            e.printStackTrace();
        }
    }
}

我试图在servlet中打印URL,但只得到了shocked.jpg,而没有得到完整的
文件路径。可能完整的
文件路径
没有出现,这就是找不到文件错误的原因。那么如何发送完整的
文件路径呢?

从JSP/HTML上传文件时,必须将表单方法设置为
POST
,并将
encType
设置为
多部分/表单数据
。()

Servlet doPost:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String url=request.getParameter("image");
    InputStream is = request.getInputStream();
    BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream()));
    String line = null;
    PrintWriter pw=response.getWriter();
    pw.println("Reading file");
    while ((line = reader.readLine()) != null) {
         pw.println(line);
    }
    pw.flush();
}

现在,您必须根据需要解析文件内容。参考博客文章。但是,我强烈建议使用apachecommons FileUpload进行同样的操作。

这看起来像是一个本地错误,因为它确实找不到
url
指定的文件。我建议通过打印
url
字符串进行调试,并创建一个伪类,为
doGet
方法提供一个手工制作的请求/响应,以确保问题是在程序本身还是在请求的某些意外传递/格式化中(您可能希望注释掉此方法的某些部分,例如连接和语句部分)

编辑:虚拟类(或方法,在本例中)的示例:


我无法创建一个虚拟类来为doGet方法提供一个手工请求/响应,以确定问题是在程序本身还是在请求部分的某些意外传递/格式化中!!它只打印shopped.jpg,即图片名本身,而不是类路径。这让我感觉到完整的文件路径不会出现,并且这就是它找不到文件的原因。那么我该怎么做才能得到确切的路径呢?它可能是相对路径,而不是绝对路径-它从程序运行的文件夹开始(如果从IDE运行它,通常是项目文件夹)作为第一步,试着把请求的文件移动到那里。@ SuiRADHikARI:你只会得到文件名而不是PATH。考虑一个情况,你的服务器和客户端在不同的位置,你正在上传一个文件。这不是文件/图像上传的工作方式。你把它存储在Oracle?
java.io.FileNotFoundException: Counter-Strike-Servers.jpg (The system cannot find the file specified)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(Unknown Source)
at InsertImage.doGet(InsertImage.java:39)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179)
at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:241)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:580)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)
<form action="InsertImage" method="post" encType="multipart/form-data" name="form1">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    </head>
    <body>
        <form action="InsertImage" name="form1" method="post" enctype="multipart/form-data">
            INSERT IMAGE
            <input type="file" name="image"></input>
            <input type="submit" name="upload"></input>
        </form>

        </body>
        </html>

    </body>
</html>
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String url=request.getParameter("image");
    InputStream is = request.getInputStream();
    BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream()));
    String line = null;
    PrintWriter pw=response.getWriter();
    pw.println("Reading file");
    while ((line = reader.readLine()) != null) {
         pw.println(line);
    }
    pw.flush();
}
private void testDoGet() {
    // I would suggest commenting out all the Connection and PreparedStatement
    // parts of the doGet method so you don't have to establish the connection.
    // - this is just to test if you can get to the image on your machine.
    HttpServletRequest request;
    //insert into request the image parameter with the string to the requested image
    HttpServletResponse response //TODO initialize with some class implementing it
    doGet(request, response);
    // if you want to, set a breakpoint somewhere here to check 
    // what's in the classes now        
}