【问题标题】:i cant insert blob image to oracle db using jdbc我无法使用 jdbc 将 blob 图像插入到 oracle db
【发布时间】:2019-06-09 04:31:45
【问题描述】:

我正在尝试使用 JDBC 将图像上传到 oracle DB。我得到一个异常“系统找不到指定的文件”

这是代码

<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.io.FileInputStream"%>
<%@page import="java.io.*"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>
<%@page import="java.util.*"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    </head>
 <body>

  <%
try{ 
    Class.forName("oracle.jdbc.driver.OracleDriver");
    System.out.println("Connection loaded");
    Connection c=DriverManager.getConnection       ("jdbc:oracle:thin:@localhost:1521:xe","system","oracle123");
System.out.println("Connection created");
String ll=request.getParameter("user_file");
String id=request.getParameter("id");
File imgfile = new File(ll);//till this pint the code is running correctly
FileInputStream fin = new FileInputStream(imgfile);//working in this point...
PreparedStatement pre = c.prepareStatement("insert into PHOTOS (id,photo) values(?,?)");
pre.setString(1,id);
pre.setBinaryStream(2,fin,(int)imgfile.length());
pre.executeUpdate();
pre.close();
}catch(Exception E){out.println("the eror is  "+ E);}
      %>
</body>
</html>

【问题讨论】:

  • 在这里打印堆栈跟踪和过去。可能您正在寻找应用程序上下文之外的文件
  • 这样的代码真的不属于 JSP。
  • 此外,其他 cmets,preparedStatement close() 方法的执行应该在 finally 块中,连同 Connection 对象 close() 方法
  • 谢谢,非常感谢您的 cmets。

标签: java oracle jdbc blob fileinputstream


【解决方案1】:

假设您来自多部分 HTTP POST,例如

<form action="upload.jsp" method="post" enctype="multipart/form-data">
    <input type="text" name="id" size="10" />
    <br />
    <input type="file" name="user_file" size = "50" />
    <br />
    <input type="submit" value="Upload File" />
</form>

你需要一个文件上传组件,比如 org.apache.commons.fileupload 之类的

Class.forName("oracle.jdbc.driver.OracleDriver");

DiskFileItemFactory factory = new DiskFileItemFactory();
// Set memory threshold - beyond which files are stored in disk 
factory.setSizeThreshold(1024*1024); // 1Mb
// Set temporary location to store files
factory.setRepository(new File(System.getProperty("java.io.tmpdir")));

ServletFileUpload upload = new ServletFileUpload(factory);

try (Connection c = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","system","oracle123")) {
    String id = null;
    InputStream photo = null;
    int photoSize = 0;

    for (FileItem item : upload.parseRequest(request)) {

        if (item.isFormField()) {
                if (item.getFieldName().equals("id")) {
                    id = item.getString();
                }
        } else {
            if (item.getFieldName().equals("user_file")){
                photo = item.getInputStream();
                photoSize = item.getSize();
            }
        }
    }

    assert (id!=null);
    assert (photo!=null);

    try (PreparedStatement pre = c.prepareStatement("insert into PHOTOS (id,photo) values(?,?)")) {
        pre.setString(1,id);
        pre.setBinaryStream(2,item.getInputStream(),item.getSize());
        pre.executeUpdate();
    }
}

【讨论】:

  • 谢谢,Serg 先生,我收到此错误 java.sql.SQLException: Missing IN or OUT parameter at index:: 2
  • 我编辑这一行 // for (FileItem item : upload.parseRequest(new ServletRequestContext(request))) 并添加 2 行:pre.executeUpdate(); pre.close(); } } } %>
  • 我错过了代码示例中的 pre.executeUpdate()(我已经添加了它)但是没有必要显式调用 pre.close() 因为 try (PreparedStatemjent pre ...) { } 将在引擎盖下进行。 index:: 2 处缺少 IN 或 OUT 参数一定是因为 pre.setBinaryStream() 并未实际执行。
  • 这个我解决不了(没有实际执行)
  • 我改变了代码流。确保 id 和 photo 变量都获得非空值(由断言检查)。
猜你喜欢
  • 2020-12-26
  • 2018-11-13
  • 1970-01-01
  • 2020-06-13
  • 2019-12-31
  • 1970-01-01
  • 2017-03-23
  • 1970-01-01
  • 2017-03-08
相关资源
最近更新 更多