2014-11-25 15 views
1

我試圖在Tomcat 7中使用Servlet和JSP在MySQL數據庫中插入圖像。當我點擊保存按鈕時,它顯示爲空。我沒有收到任何錯誤。如何在Tomcat中使用Servlet和JSP在MySQL數據庫中插入圖像7

我還設置了commons-fileupload.jar文件和commons-io.jar文件。如果你有一些演示代碼,請給我。

<%@ 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="FileUploadDBServlet" 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> 

FileUploadDBServlet.java

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("/FileUploadDBServlet") 
@MultipartConfig(maxFileSize = 16177215) // upload file's size up to 16MB 
public class FileUploadDBServlet extends HttpServlet { 

    // database connection settings 
    private String dbURL = "jdbc:mysql://localhost:3306/AppDB"; 
    private String dbUser = "root"; 
    private String dbPass = "root"; 

    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 { 

       Class.forName("com.mysql.jdbc.Driver").newInstance(); 
      conn = DriverManager.getConnection(dbURL,dbUser,dbPass); 


      String sql =("INSERT INTO contacts (first_name, last_name, 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.setBlob(3, inputStream); 
      } 

      // sends the statement to the database server 
      int row = statement.executeUpdate(); 
      if (row > 0) { 
       message = "File uploaded and saved into database"; 
      } 
     } catch (Exception ex) { 
      message = "ERROR: " + ex.getMessage(); 
      ex.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); 
     } 
    } 
} 

web.xml中

<web-app> 
    <servlet> 
    <servlet-name>FileUploadDBServlet</servlet-name> 
    <servlet-class>FileUploadDBServlet</servlet-class> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>FileUploadDBServlet</servlet-name> 
    <url-pattern>/FileUploadDBServlet</url-pattern> 
    </servlet-mapping> 
</web-app> 
+0

只需使用BLOB數據類型。鏈接http://www.codesuggestions.com/java/insert-an-image-into-mysql-database-using-jsp-page/ – 2014-11-25 12:26:21

回答

4

下面的代碼說明如何存儲/從數據庫檢索圖像/。

首先在數據庫創建一個表,可以使用下面的代碼

CREATE TABLE contacts (
    contact_id int PRIMARY KEY AUTO_INCREMENT, 
    first_name varchar(45) DEFAULT NULL, 
    last_name varchar(45) DEFAULT NULL, 
    photo` mediumblob); 

創建輸入參數的JSP文件。

Upload.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
        pageEncoding="ISO-8859-1"%> 
<!DOCTYPE html> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
     <title>File Upload to Database</title> 
    </head> 
    <body> 
     <h1>File Upload to Database</h1> 
     <form name="fileform" method="post" action="uploadServlet" enctype="multipart/form-data"> 
      <label for="firstName">First Name:</label> 
      <input type="text" name="firstName" size="50" placeholder="Enter Your FirstName" required/><br><br> 
      <label for="lastName">Last Name: </label> 
      <input type="text" name="lastName" size="50" placeholder="Enter Your LastName" required/><br><br> 
      <label for="photo"> Portrait Photo: </label> 
      <input type="file" name="photo" size="50" placeholder="Upload Your Image" required/><br><br> 
      <input type="submit" value="Save"> 
     </form> 
    </body> 
</html> 

接下來,創建控制器上傳圖像。在這種情況下,我正在使用一個servlet。

FileUploadDbServlet.java:

package com.fileupload.attach; 

import java.io.IOException; 
import java.io.InputStream; 
import java.io.FileOutputStream; 
import java.io.OutputStream; 
import java.sql.Blob; 
import java.sql.ResultSet; 
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.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.http.Part; 

@MultipartConfig(maxFileSize = 16177215) 
// upload file's size up to 16MB 
public class FileUploadDBServlet extends HttpServlet { 
    private static final int BUFFER_SIZE = 4096; 
    // database connection settings 
    private String dbURL = "jdbc:mysql://localhost:3306/mysql"; 
    private String dbUser = "root"; 
    private String dbPass = "arun"; 

    //naive way to obtain a connection to database 
    //this MUST be improved, shown for 
    private Connection getConnection() { 
     Connection conn = null; 
     try { 
      DriverManager.registerDriver(new com.mysql.jdbc.Driver()); 
      conn = DriverManager.getConnection(dbURL, dbUser, dbPass); 
     } catch (Exception e) { 
      //wrapping any exception and rethrowing it 
      //inside a RuntimeException 
      //so the method is silent to exceptions 
      throw new RuntimeException("Failed to obtain database connection.", e); 
     } 
     return conn; 
    } 

    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
     //get 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 
      //the InputStream will point to a stream that contains 
      //the contents of the 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 
      conn = getConnection(); 
      // constructs SQL statement 
      String sql = "INSERT INTO contacts (first_name, last_name, photo) values (?, ?, ?)"; 
      //Using a PreparedStatement to save the file 
      PreparedStatement pstmtSave = conn.prepareStatement(sql); 
      pstmtSave.setString(1, firstName); 
      pstmtSave.setString(2, lastName); 

      if (inputStream != null) { 
       //files are treated as BLOB objects in database 
       //here we're letting the JDBC driver 
       //create a blob object based on the 
       //input stream that contains the data of the file 
       pstmtSave.setBlob(3, inputStream); 
      } 
      //sends the statement to the database server 
      int row = pstmtSave.executeUpdate(); 
      if (row > 0) { 
       message = "File uploaded and saved into database"; 
      } 

      String filepath = "D:/Dev/JavaWorkSpaceNew/FileUploadDatabase/WebContent/FromDb.jpg"; 
      //Obtaining the file from database 
      //Using a second statement 
      String sql1 = "SELECT photo FROM contacts WHERE first_name=? AND last_name=?"; 
      PreparedStatement pstmtSelect = conn.prepareStatement(sql1); 
      pstmtSelect.setString(1, firstName); 
      pstmtSelect.setString(2, lastName); 
      ResultSet result = statement1.executeQuery(); 
      if (result.next()) { 
       Blob blob = result.getBlob("photo"); 
       InputStream inputStream1 = blob.getBinaryStream(); 
       OutputStream outputStream = new FileOutputStream(filepath); 
       int bytesRead = -1; 
       byte[] buffer = new byte[BUFFER_SIZE]; 
       while ((bytesRead = inputStream1.read(buffer)) != -1) { 
        outputStream.write(buffer, 0, bytesRead); 
       } 
       inputStream1.close(); 
       outputStream.close(); 
       System.out.println("File saved"); 
      } 
     } catch (SQLException ex) { 
      message = "ERROR: " + ex.getMessage(); 
      ex.printStackTrace(); 
     } finally { 
      if (conn != null) { 
       // closes the database connection 
       try { 
        conn.close(); 
       } catch (SQLException ex) { 
        //silent 
       } 
      } 
      // sets the message in request scope 
      request.setAttribute("message", message); 

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

的web.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app> 
    <display-name>servletFileUpload</display-name> 
    <welcome-file-list> 
     <welcome-file>Upload.jsp</welcome-file> 
    </welcome-file-list> 
    <servlet> 
     <description></description> 
     <display-name>FileUploadDBServlet</display-name> 
     <servlet-name>FileUploadDBServlet</servlet-name> 
    <servlet-class>com.fileupload.attach.FileUploadDBServlet</servlet-class> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>FileUploadDBServlet</servlet-name> 
     <url-pattern>/uploadServlet</url-pattern> 
    </servlet-mapping> 
</web-app> 

Message.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
     pageEncoding="ISO-8859-1"%> 
<!DOCTYPE html> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
     <title>Message</title> 
    </head> 
    <body> 
     <h3>Result of the operation: ${message}</h3> 
    </body> 
</html> 
-1
Jsp Page 

Save this page with any name 


<%@page contentType="text/html" pageEncoding="UTF-8"%> 
<!DOCTYPE html> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <title>JSP Page</title> 
    </head> 
    <body> 
     <form action="abc" method="post" enctype="multipart/form-data"> <br><br> 
      <table> 
       <tr> 
        <td>UserName: </td> 
        <td width='10px'></td> 
        <td><input type="text" name="name"/></td> 
       </tr> 

       <tr> 
        <td>Upload: </td> 
        <td width='10px'></td> 
        <td><input type="file" name="file" value="Upload"/></td> 
       </tr> 
       <tr> 
        <td><input type="submit" value="submit"></td> 
       </tr> 
      </table> 
     </form> 
    </body> 
</html> 




Servlet page and save this page as abc.java 


source code 


import java.io.File; 
import java.io.IOException; 
import java.io.PrintWriter; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
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(urlPatterns = {"/abc"}) 
@MultipartConfig(fileSizeThreshold = 1024 * 1024 * 10, maxFileSize = 1024 * 1024 * 50, maxRequestSize = 1024 * 1024 * 100) 
public class abc extends HttpServlet { 

// this if directory name where the file will be uploaded and saved 
    private static final String SAVE_DIR = "images"; 

// this is the method which is created by system it self 
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     response.setContentType("text/html;charset=UTF-8"); 
     try (PrintWriter out = response.getWriter()) { 

//   this tyr is created by me for the connection of database 
      try { 

//    this is the path provide by me to save the image 
       String savePath = "C:" + File.separator + SAVE_DIR; 
/*in place of C: you can place a path wher you need to save the image*/ 

//    this comment will picup the image file and have convert it into file type 
       File fileSaveDir = new File(savePath); 
       if (!fileSaveDir.exists()) { 
        fileSaveDir.mkdir(); 
       } 

//    this two comment will take the name and image form web page 
       String name = request.getParameter("name"); 
       Part part = request.getPart("file"); 

//    this comment will extract the file name of image 
       String fileName = extractFileName(part); 

//    this will print the image name and user provide name 
       out.println(fileName); 
       out.println("\n" + name); 

       /*if you may have more than one files with same name then you can calculate 
    some random characters and append that characters in fileName so that it will 
    make your each image name identical.*/ 
       part.write(savePath + File.separator + fileName); 

       /* 
       You need this loop if you submitted more than one file 
       for (Part part : request.getParts()) { 
       String fileName = extractFileName(part); 
       part.write(savePath + File.separator + fileName); 
      }*/ 
//   connectio to database 
       Class.forName("com.mysql.jdbc.Driver"); 
       Connection con = DriverManager.getConnection("url", "host -name", "password"); 

//    query to insert name and image name 
       String query = "INSERT INTO image_link (name,photourl) values (?, ?)"; 

       PreparedStatement pst; 
       pst = con.prepareStatement(query); 
       pst.setString(1, name); 
       String filePath = savePath + File.separator + fileName; 
       pst.setString(2, filePath); 
       pst.executeUpdate(); 

      } catch (Exception ex) { 
       out.println("error" + ex); 
      } 

     } 
    } 

// the extractFileName() is method used to extract the file name 
    private String extractFileName(Part part) { 
     String contentDisp = part.getHeader("content-disposition"); 
     String[] items = contentDisp.split(";"); 
     for (String s : items) { 
      if (s.trim().startsWith("filename")) { 
       return s.substring(s.indexOf("=") + 2, s.length() - 1); 
      } 
     } 
     return ""; 
    } 

    @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); 
    } 

    @Override 
    public String getServletInfo() { 
     return "Short description"; 
    }// </editor-fold> 

} 
+0

添加一些解釋 – HaveNoDisplayName 2016-09-10 13:25:11

相關問題