上传图像文件jsp mysql时出错

时间:2013-10-14 01:56:30

标签: mysql jsp

这是后端代码,

<%@ page contentType="text/html;charset=utf-8"%>
<%@ page import="java.util.*"%>
<%@ page import="java.sql.*"%>
<%@ page import="java.io.*"%>

<%@ page import="org.apache.commons.fileupload.servlet.*"%>
<%@ page import="org.apache.commons.fileupload.*"%>

<%@ page import="org.apache.commons.fileupload.disk.*"%>

<%! Connection con=null; %>
<%! Statement st= null; %>

<%
String lunchName = null;
String lunchDate = null;
InputStream lunchImage = null;
//out.print("lunch name:::::");
//out.print(request.getParameter("lunch_name"));
//out.print("lunch date:::::");
//out.print(request.getParameter("lunch_date"));
String id = request.getParameter("id");

//Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();

//Configure a repository (to ensure a secure temp location is used)
ServletContext servletContext = this.getServletConfig().getServletContext();
File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
factory.setRepository(repository);

//Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);

//Parse the request
List<FileItem> items = upload.parseRequest(request);
Iterator<FileItem> iter = items.iterator();
while (iter.hasNext()) {
    FileItem item = iter.next();

    if (item.isFormField()) {
            String name = item.getFieldName();
            String value = item.getString();
            if(name.equals("lunch_name"))
                lunchName = value;
            else if(name.equals("lunch_date"))
                lunchDate = value;

    } else {
        lunchImage = item.getInputStream();
        //String fieldName = item.getFieldName();
        //String fileName = item.getName();
        //String contentType = item.getContentType();
        //boolean isInMemory = item.isInMemory();
        //long sizeInBytes = item.getSize();
        //out.print("fieldName : " + fieldName+"<br/>");
        //out.print("fileName : " + fileName+"<br/>");
    }
}
try{
    String message = null;
    Connection con=null;
    String driver = "com.mysql.jdbc.Driver";
    String url = "jdbc:mysql://localhost:3306/first_app";
    String user = "root";
    String password = "asd462";
    Class.forName("com.mysql.jdbc.Driver").newInstance();
    con = DriverManager.getConnection(url, user, password);
    String sql = "insert into lunch_menu(lunch_image,lunch_name,lunch_date) values(?,?,?)";
    PreparedStatement statement = con.prepareStatement(sql);
    if (lunchImage != null) {
        // fetches input stream of the upload file for the blob column
        statement.setBlob(1, lunchImage);
    }
    statement.setString(2, lunchName);
    statement.setString(3, lunchDate);



    // sends the statement to the database server
    int row = statement.executeUpdate();
    if (row > 0) {
        message = "File uploaded and saved into database";
    }
}catch(SQLException ex){

     ex.printStackTrace();
}finally {
    if (con != null) {
        // closes the database connection
        try {
            con.close();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }

}





%>

我已经检查过前面的数据是否正常。

但如果我运行这个,我有这样的错误。

org.apache.jasper.JasperException: An exception occurred processing JSP page /jsp/writeMenu.jsp at line 73

70:     PreparedStatement statement = con.prepareStatement(sql);
71:     if (lunchImage != null) {
72:         // fetches input stream of the upload file for the blob column
73:         statement.setBlob(1, lunchImage);
74:     }
75:     statement.setString(2, lunchName);
76:     statement.setString(3, lunchDate);


Stacktrace:
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:553)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:442)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:391)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
root cause

javax.servlet.ServletException: java.lang.AbstractMethodError: com.mysql.jdbc.PreparedStatement.setBlob(ILjava/io/InputStream;)V
    org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:911)
    org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:840)
    org.apache.jsp.jsp.writeMenu_jsp._jspService(writeMenu_jsp.java:174)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:419)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:391)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
root cause

java.lang.AbstractMethodError: com.mysql.jdbc.PreparedStatement.setBlob(ILjava/io/InputStream;)V
    org.apache.jsp.jsp.writeMenu_jsp._jspService(writeMenu_jsp.java:135)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:419)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:391)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.12 logs.

我按照这里的代码,

http://www.codejava.net/coding/upload-files-to-database-servlet-jsp-mysql

加,

http://commons.apache.org/proper/commons-fileupload/using.html

应该是什么问题?

1 个答案:

答案 0 :(得分:1)

您的堆栈跟踪显示java.lang.AbstractMethodError com.mysql.jdbc.PreparedStatement.setBlob这表示您的JDBC驱动程序未使用InputStream参数实现setBlob方法。根据{{​​3}},仅从1.6(Java 6)开始支持此功能。检查您的Java和驱动程序版本;你需要一个更新的版本来实现这个方法。