0

I am following the code in http://www.codejava.net/coding/upload-files-to-database-servlet-jsp-mysql. I have modified some of the code, and it is now working. The problem I have now is, I've also added the "select * from contact" to see the value of the uploaded file, but the value stored in its field is in binary format (the datatype in the database is varbinary)

Is it possible to convert the binary data into String, so that when it is stored in the database, the value is already in String format? And that when I do the "select * from contact", the value for the field displayed will be in String format?

FileUploadDB.java

package com.process.web.controller;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

@WebServlet("/fileuploaddb.html")
@MultipartConfig(maxFileSize = 16177215)
public class FileUploadDB extends HttpServlet {
private static final long serialVersionUID = 1L;


protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doPost(request,response);
}

private String dbURL = "jdbc:jtds:sqlserver://localhost:1433;DatabaseName=ATS;SelectMethod=cursor;";
private String dbUser = "sa";
private String dbPass = "benilde";

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    // gets values of text fields
            String firstName = request.getParameter("firstName");
            String lastName = request.getParameter("lastName");

            InputStream inputStream = null; // input stream of the upload file

            // obtains the upload file part in this multipart request
            Part filePart = request.getPart("photo");
            if (filePart != null) {
                // prints out some information for debugging
                System.out.println(filePart.getName());
                System.out.println(filePart.getSize());
                System.out.println(filePart.getContentType());

                // obtains input stream of the upload file
                inputStream = filePart.getInputStream();
            }

            Connection conn = null; // connection to the database
            String message = null;  // message will be sent back to client

            try {

                // connects to the database
                //DriverManager.registerDriver(new com.mysql.jdbc.Driver());
                //DriverManager.getConnection(dbURL);
                //com.microsoft.sqlserver.jdbc.Driver

                Class.forName("net.sourceforge.jtds.jdbc.Driver").newInstance();
                conn = DriverManager.getConnection(dbURL, dbUser, dbPass);
                if(conn!=null) {
                    System.out.println("Connection Successful!");
                } else {
                    System.out.println("Error in Connection");
                }
                // constructs SQL statement
                String sql = "INSERT INTO contact (firstname, lastname, photo) values (?, ?, ?)";
                PreparedStatement statement = conn.prepareStatement(sql);
                statement.setString(1, firstName);
                statement.setString(2, lastName);

                if (inputStream != null) {
                    // fetches input stream of the upload file for the blob column
                    statement.setBinaryStream(3, filePart.getInputStream(), (int)(filePart.getSize()));                     

                }

                // sends the statement to the database server
                int row = statement.executeUpdate();
                if (row > 0) {
                    message = "File uploaded and saved into database";
                }
            } catch (SQLException ex) {
                message = "ERROR: " + ex.getMessage();
                ex.printStackTrace();
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InstantiationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {
                if (conn != null) {
                    // closes the database connection
                    try {
                        conn.close();
                    } catch (SQLException ex) {
                        ex.printStackTrace();
                    }
                }
                // sets the message in request scope
                request.setAttribute("Message", message);

                // forwards to the message page
                         getServletContext().getRequestDispatcher("/Message.jsp").forward(request, response);
            }
        }
        }

This is the upload.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>File Upload to Database Demo</title>
</head>
<body>
<center>
    <h1>File Upload to Database Demo</h1>
    <form method="post" action="fileuploaddb.html" enctype="multipart/form-data">
        <table border="0">
            <tr>
                <td>First Name: </td>
                <td><input type="text" name="firstName" size="50"/></td>
            </tr>
            <tr>
                <td>Last Name: </td>
                <td><input type="text" name="lastName" size="50"/></td>
            </tr>
            <tr>
                <td>Portrait Photo: </td>
                <td><input type="file" name="photo" size="50"/></td>
            </tr>
            <tr>
                <td colspan="2">
                    <input type="submit" value="Save">
                </td>
            </tr>
        </table>
    </form>
</center>
</body>
</html>


**This is the Message.jsp**

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Message</title>
</head>
<body>
<center>
    <h3><%=request.getAttribute("Message")%></h3>
</center>
</body>
</html>
Kate
  • 15
  • 1
  • 7

1 Answers1

1

AbstractMethodError means your JDBC driver's PreparedStatements don't implement

setBlob(int, InputStream).

Just saw the driver you are using and according to the documentation it doesnt take

`setBlob(int, InputStream)`

But instead it takes

setBlob(int parameterIndex, java.sql.Blob x) 

Read this document http://jtds.sourceforge.net/doc/net/sourceforge/jtds/jdbc/JtdsPreparedStatement.html for further help or else I would suggest you to change the driver you are using.

Refer to this SO post

Community
  • 1
  • 1
Santino 'Sonny' Corleone
  • 1,735
  • 5
  • 25
  • 52