使用jsp和servlet在MySql数据库中存储文件。

时间:2015-04-14 06:23:12

标签: java mysql jsp servlets

我正在尝试使用jsp和servlet在mySql数据库中存储文件(文本或图像)。

这是index.jsp。

<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>
  1. 这是我的FileUploadDBServlet。

    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(name = "FileUploadDBServlet", urlPatterns ={"/FileUploadDBServlet"})          
    public class FileUploadDBServlet extends HttpServlet {
    
       // database connection settings
         String dbURL = "jdbc:mysql://localhost:3306/rep";
          String dbUser = "root";
          String dbPass = "";
    
        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();
    
    }
     //System.out.println(inputStream);
    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());
        conn = DriverManager.getConnection(dbURL, dbUser, dbPass);
    
        // constructs SQL statement
        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 (SQLException 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);
    }
    }
    }
    
  2. 这是我的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"/>
    
     <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>
    
  3. 消息页面显示&#34;错误:没有为参数3和#34;指定值。 所以,我认为null值存储在inputStream中。为什么会如此以及如何处理? 感谢。

2 个答案:

答案 0 :(得分:1)

如果yoúrinputstream为null,则可以使用statement.setNull(3, java.sql.Types.BLOB);

if (inputStream != null) {
    // fetches input stream of the upload file for the blob column
    statement.setBlob(3, inputStream);
} else {
    statement.setNull(3, java.sql.Types.BLOB);
}

答案 1 :(得分:0)

当您使用 enctype =“multipart / form-data”提交表单数据为此,您必须在上传servlet中提及@MultipartConfig(maxFileSize =“max file size”)。