user2997816
user2997816

Reputation: 31

Upload a photo to a DB using servlets

I am trying to make a Servlet that upload and insert an image to the Data base . this image is of blob type in the database . The code gives me this error : org.netbeans.modules.web.monitor.server.MonitorRequestWrapper cannot be cast to org.apache.tomcat.util.http.fileupload.RequestContext [Ljava.lang.StackTraceElement;@30ec706b

here is a part of my code : ## web.xml ##

        <servlet>
          <servlet-name>UploadServlet</servlet-name>
          <servlet-class>Servlet.UploadServlet</servlet-class>
            <init-param>
              <param-name>uploadDir</param-name>
              <param-value>/tmp</param-value>
             </init-param>
         </servlet>

DataUtente

    protected void processRequest(HttpServletRequest request, HttpServletResponse           
                                   response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        HttpSession session=request.getSession(false);
        PrintWriter out = response.getWriter();

        try {

            out.println("<!DOCTYPE html>");
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet DataUtente</title>");            
            out.println("</head>");
            out.println("<body>");
            Utente utente =(Utente)session.getAttribute("utente");
            out.println("<h1> Welcome  " + utente.getUsername() + "</h1>");

            out.println("    <form name=\"myWebForm\" action=\"UploadServlet\"                  
                             method=\"POST\" ENCTYPE=\"multipart/form-data\">\n" + 
                        " <input type=\"file\" name=\"uploadField\" />\n" +
                        " <INPUT TYPE='submit' VALUE='upload'>"+
                        "</form>");
            out.println("</body>");
            out.println("</html>");
        } finally {
            out.close();
        }
    }

UploadServlet

public class UploadServlet extends HttpServlet {
   DBManager dbman;
   private int maxFileSize = 50 * 1024;
   private int maxMemorySize = 4 * 1024;
   private File file ;
   private String dirName;

    public void init(ServletConfig config) throws ServletException{
        super.init(config);

          //read the uploadDir from the servlet parameters 
        dirName=config.getInitParameter("uploadDir");
        if(dirName== null){
            throw  new ServletException("Please supply uploadDir parameters");
        }
    }
    protected void processRequest(HttpServletRequest request, HttpServletResponse   
                                    response)
            throws ServletException, IOException {
             response.setContentType("text/html;charset=UTF-8");
             HttpSession session=request.getSession(false);
             PrintWriter out = response.getWriter();
        try {
            // Apache Commons-Fileupload library classes
            DiskFileItemFactory factory = new DiskFileItemFactory();
            //maximum size that will be stored in memory 
            factory.setSizeThreshold(maxMemorySize);
           //create a file upload handler
            ServletFileUpload upload  = new ServletFileUpload(factory);
           // maximum file size to be uploaded.
            upload.setSizeMax( maxFileSize );

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

               // parse request
            List items = upload.parseRequest((RequestContext) request);
               // get uploaded file
            FileItem file = (FileItem) items.get(0);

            // Connect to the DB

            dbman = new DBManager();
            Utente utente=(Utente)session.getAttribute("utente");
            //String query = "insert into photos values(?)";        
            PreparedStatement ps = dbman.connectToDB().prepareStatement("insert  into 
                        Utente(avatar) values(?) where Id='" + utente.getId() + "'");


            ps.setBinaryStream(1, file.getInputStream(), (int) file.getSize());
            ps.executeUpdate();
           // dbman.connectToDB().commit();
            dbman.connectToDB().close();
            out.println("Proto Added Successfully. <p> <a href='listphotos'>List Photos   
                         </a>");
        }
        catch(Exception ex) {
            out.println( "Error ==> " + ex.getMessage());
            out.print(ex.getStackTrace());
        }
     }

and here is the DDmanager:

public void  closeConnection(){
        try {
            dbConnection.close();
        } catch (SQLException ex) {
            ex.printStackTrace();
            Logger.getLogger(DBManager.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    public Connection connectToDB() throws SQLException, ClassNotFoundException{
         String dbString = null;
            Class.forName(driver);
            dbString = "jdbc:derby://localhost:1527/DB";
            dbConnection = (Connection) DriverManager.getConnection(dbString, userName, 
                              password);
        return dbConnection;

    }

    public boolean connectToDb() {
        //conneto a db 
        try {
            String dbString = null;
            Class.forName(driver);
            dbString = "jdbc:derby://localhost:1527/DB";
            dbConnection = (Connection) DriverManager.getConnection(dbString, userName, 
                              password);

        } catch (Exception e) {
            e.printStackTrace();
       //     System.out.print("erore");
            return false;
        }
        return true;

    }

    public ResultSet executeQuery(String command) {
        try {
            stmt = dbConnection.createStatement();
            ResultSet ress = stmt.executeQuery(command);
            return ress;

        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public void  executeUpdateQuery(String command) {
        try {
            stmt = dbConnection.createStatement();
            int ress = stmt.executeUpdate(command);
            stmt.close();  

        } catch (Exception e) {
            e.printStackTrace();

        }

Upvotes: 1

Views: 922

Answers (2)

Vladimir
Vladimir

Reputation: 1

I used alternative classes:


    import org.apache.commons.fileupload.FileItem;
    import org.apache.commons.fileupload.FileItemFactory;
    import org.apache.commons.fileupload.FileUploadException;
    import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    import org.apache.commons.fileupload.servlet.ServletFileUpload;

    @WebServlet("/FileUploadServlet")
    public class FileUploadServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;

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

            FileItemFactory factory = new DiskFileItemFactory();
            ServletFileUpload upload = new ServletFileUpload(factory);

            // set file upload progress listener
            FileUploadListener listener = new FileUploadListener();

            HttpSession session = request.getSession();

            session.setAttribute("LISTENER", listener);

            // upload servlet allows to set upload listener
            upload.setProgressListener(listener);

            List uploadedItems = null;
            FileItem fileItem = null;
            String filePath = "c:\\My\\tmp";    // Path to store file on local system

            try {
                // get all uploaded files
                uploadedItems = upload.parseRequest(request);

    //          Iterator i = uploadedItems.iterator();

                if(uploadedItems.size()>0)  {
                    fileItem = (FileItem) uploadedItems.get(0);//i.next();

                    if (fileItem.isFormField() == false) {
                        if (fileItem.getSize() > 0) {
                            File uploadedFile = null; 
                            String myFullFileName = fileItem.getName(),
                                    myFileName = "",
                                    slashType = (myFullFileName.lastIndexOf("\\") > 0) ? "\\" : "/"; // Windows or UNIX
                            int
                                startIndex = myFullFileName.lastIndexOf(slashType);

                            // Ignore the path and get the filename
                            myFileName = "imgout.jpg";  //myFullFileName.substring(startIndex + 1, myFullFileName.length());

                            // Create new File object
                            uploadedFile = new File(filePath, myFileName);

                            // Write the uploaded file to the system
                            fileItem.write(uploadedFile);
                        }
                    }
                }
            } catch (FileUploadException e) { e.printStackTrace(); } 
            catch (Exception e) { e.printStackTrace(); } 
        }

Upvotes: 0

Vagner Lucas Gomes
Vagner Lucas Gomes

Reputation: 103

Look your version of apache tomcat, I upgraded to 7.0.41 and TBM gave the error, returned to 7.0.34 and it worked again, not yet found the way to do this in 7.0.41

  List items = upload.parseRequest((RequestContext) request);

remove conversion (RequestContext) if return the version of apache

List items = upload.parseRequest(request);

Upvotes: 1

Related Questions