Upload photos into Oracle BLOB column from Java Servlet and listing photos

In this post, I will show how to do the following tasks using Java.

Create web project and add libraries

First of all create a new web project and add the following libraries to it. I named the project as photos. You can give any name to the project. I am using NetBeans IDE 6.5 for this example. You can use any IDE of your choice and any version of NetBeans.

Create PHOTOS table

Create a table in Oracle database as follows. This table contains id, which is unique for each photo, title of the photo and photo itself stored as BLOB.
  create table photos
  ( 
    id  number(5) primary key,
    title  varchar(50),
    photo  blob
  );

Download Commons-Fileupload library

As we have to deal with File upload, we need to use apaches commons-fileupload library. This library dependes on commons-io library. So, we need to download both these libraries from commons-fileupload and commons-io.

After you download these libraries, add .jar files to project using libraries node in NetBeans project window. Do whatever is necessary to include these libraries if you are using other IDEs other than NetBeans.

Create HTML form to upload photo

Create a HTML form to take data regarding a new photo. It contains two text fields and one file field to upload photo to server.
 <html>
    <head>
        <title>Add Photo</title>
    </head>
    <body>
        <h2>Add Photo</h2>
        <form id="form1" enctype="multipart/form-data" action="addphoto" method="post">
            <table>
                <tr>
                    <td>Enter Photo Id :</td>
                    <td><input  type="text"  name="id"/></td>
                </tr>
                <tr>
                    <td>Enter Title For Photo :</td>
                    <td><input  type="text"  name="title"/></td>
                </tr>
                <tr>
                    <td>Select Photo  </td>
                    <td><input type="file"  name="photo" />
                </tr>
            </table>
            <p/>
            <input type="submit" value="Add Photo"/>
        </form>

        <p/>
        <a href="listphotos">List Photos </a>
    </body>
</html>

AddPhotoServlet

When user clicks on Submit button, the above form calls AddPhotoServlet, which inserts a row into PHOTOS table. The code for AddPhotoServlet.java is given below. Create this servelt and assign addphoto as the url pattern for it.
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class AddPhotoServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            // Apache Commons-Fileupload library classes
            DiskFileItemFactory factory = new DiskFileItemFactory();
            ServletFileUpload sfu  = new ServletFileUpload(factory);

            if (! ServletFileUpload.isMultipartContent(request)) {
                System.out.println("sorry. No file uploaded");
                return;
            }

            // parse request
            List items = sfu.parseRequest(request);
            FileItem  id = (FileItem) items.get(0);
            String photoid =  id.getString();
            
            FileItem title = (FileItem) items.get(1);
            String   phototitle =  title.getString();

            // get uploaded file
            FileItem file = (FileItem) items.get(2);
                        
            // Connect to Oracle
            Class.forName("oracle.jdbc.driver.OracleDriver");
            Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "hr", "hr");
            con.setAutoCommit(false);

            PreparedStatement ps = con.prepareStatement("insert into photos values(?,?,?)");
            ps.setString(1, photoid);
            ps.setString(2, phototitle);
            // size must be converted to int otherwise it results in error
            ps.setBinaryStream(3, file.getInputStream(), (int) file.getSize());
            ps.executeUpdate();
            con.commit();
            con.close();
            out.println("Proto Added Successfully. <p> <a href='listphotos'>List Photos </a>");
        }
        catch(Exception ex) {
            out.println( "Error --> " + ex.getMessage());
        }
    } 
}

ListPhotosServlet

Create another servlet - ListPhotosServlet.java - to display the list of photos from PHOTOS table. It uses DisplayImageServelt to display each photo.
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ListPhotosServlet extends HttpServlet {
   
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "hr", "hr");
            PreparedStatement ps = con.prepareStatement("select * from photos");
            ResultSet rs = ps.executeQuery();
            out.println("<h1>Photos</h1>");
            while ( rs.next()) {
                  out.println("<h4>" + rs.getString("title") + "</h4>");
                  out.println("<img width='600' height='600' src=displayphoto?id=" +  rs.getString("id") + "></img> <p/>");
            }

            con.close();
        }
        catch(Exception ex) {

        }
        finally { 
            out.close();
        }
    } 

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

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

DisplayPhotoServlet

DisplayPhotoServlet.java sends a a single photo that is taken from PHOTO column of PHOTOS table to browser as outputstream. This servelt takes id as parameter (querystring) and send photo to IMG tag.

DisplayPhotoServlet.java

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DisplayPhotoServlet extends HttpServlet {
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "hr", "hr");
            PreparedStatement ps = con.prepareStatement("select photo from photos where id = ?");
            String id = request.getParameter("id");
            ps.setString(1,id);
            ResultSet rs = ps.executeQuery();
            rs.next();
            Blob  b = rs.getBlob("photo");
            response.setContentType("image/jpeg");
            response.setContentLength( (int) b.length());
            InputStream is = b.getBinaryStream();
            OutputStream os = response.getOutputStream();
            byte buf[] = new byte[(int) b.length()];
            is.read(buf);
            os.write(buf);
            os.close();
        }
        catch(Exception ex) {
             System.out.println(ex.getMessage());
        }
    } 

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

Here is web.xml file that contains entries related to Servlets.
    <servlet>
        <servlet-name>AddPhoto</servlet-name>
        <servlet-class>AddPhotoServlet</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>ListPhotos</servlet-name>
        <servlet-class>ListPhotosServlet</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>DisplayPhotoServlet</servlet-name>
        <servlet-class>DisplayPhotoServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>AddPhoto</servlet-name>
        <url-pattern>/addphoto</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>ListPhotos</servlet-name>
        <url-pattern>/listphotos</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>DisplayPhotoServlet</servlet-name>
        <url-pattern>/displayphoto</url-pattern>
    </servlet-mapping>


After all servlets are created, build the project and deploy it. Then run addphoto.html and enter details of some photos. Then you can click on List Photos link to see the list of photos placed in the database.



Home    Blogs

Post Your Comment

Your Name :
Your Email Address :
Comment :

Comments


Posted By sachidanandam On 07-Aug-09 06:42:35 AM

while adding photos into a oracle database iam receiving class,enum or interface exception (or) packet failure exception is handled how to resolve this ......plz help me



Posted By Emmanuel On 13-Aug-09 06:40:39 PM

Hi, this is a perfect post.... It works perfectly! Thank you for this.



Posted By sachidanandam On 16-Aug-09 06:21:39 AM

what is thin and xe refers to............



Posted By saswata banerjee On 09-Sep-09 11:42:37 AM

it's really very amazing..but i have a new idea.if u want to know that plz contact me...



Posted By bayardalai On 01-Oct-09 10:19:22 AM

Hi, thanks for all your scripts, but!!! didn't find addphoto after i done everything. other mean is can't find AddPotoServlet class. I put my all servlet to package called FileUpload. Please, anyone does know abot it



Posted By uuree On 05-Oct-09 09:51:54 AM

Hi, all. I done everythng succesfully. So to bayardalai: put web.xml file to webroot/web-inf if you are using myeclipse 6.5. put all servlets to what you greated package. That's it. Don't forget point your package directory in your web.xml file if didn't find addphoto just like FileUpload.AddPhotoServlet.



Posted By kamal On 07-Oct-09 12:43:24 AM

is it possible to perform all these three operations using one servlet ,instead of uing three .



Posted By kamal On 14-Oct-09 11:31:11 PM

is there any way to restrict any way to restrict the users to upload the files greater than specified size.