0

私はjspが初めてで、ユーザーが写真をデータベースにアップロードする簡単なページを作成しようとしています。

私は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="uploadServlet" 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>

そして、仕事をするJavaクラス:

package classes.servlets;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;

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

    // database connection settings
  static final String ODBC_DRIVER = "sun.jdbc.odbc.JdbcOdbcDriver";
  static final String DSN = "jdbc:odbc:PMRteste";
  static final String USER = "root";
  static final String PWD = "1234";


    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");
        Connection _conexao = null;

        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 {
                    try {
                try {
                    // connects to the database
                    //DriverManager.registerDriver(new com.mysql.jdbc.Driver());
                    Class.forName(ODBC_DRIVER).newInstance();
                } catch (ClassNotFoundException ex) {
                    Logger.getLogger(FileUploadDBServlet.class.getName()).log(Level.SEVERE, null, ex);
                }
                    } catch (InstantiationException ex) {
                        Logger.getLogger(FileUploadDBServlet.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (IllegalAccessException ex) {
                        Logger.getLogger(FileUploadDBServlet.class.getName()).log(Level.SEVERE, null, ex);
                    }
            _conexao = DriverManager.getConnection(DSN, USER, PWD);

            // constructs SQL statement
            String sql = "INSERT INTO contacts (first_name, last_name, photo) values (?, ?, ?)";
            //System.out.append("INSERT INTO contacts (first_name, last_name, photo) values (?, ?, ?)");
            PreparedStatement statement = _conexao.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, inputStream);
                //System.out.println("entra aqui");
            }
            // 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 (_conexao != null) {
                // closes the database connection
                try {
                    _conexao.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);
        }
    }
}

しかし、常にエラーメッセージが表示されます: [MySQL][ODBC 5.2(a) Driver][mysqld-5.6.14]SQLBindParameter not used for all parameters

データベースとの接続を確認しましたが、すべて正常に動作しています (データベースに名前と姓を追加できます)。

(message.jsp は、写真が正常に更新されたかどうかにかかわらず、ユーザーにメッセージを表示するだけです)

手伝って頂けますか?:)

4

2 に答える 2

0

これは答えではありませんが、最初に行く必要があります...

サーブレットで非静的メンバー変数を共有しないでください! (私はあなたを見ています_conexao)

アプリケーション サーバーは、このクラスの 1 つのインスタンスを作成して、すべての要求を処理することが完全に許可されています。別のリクエストが処理されている間にリクエストが到着すると、_conexaoフィールドが上書きされ、予測できない動作が発生します (偽の例外、接続のリーク、および他に何があるかは誰にもわかりません)。幸いなことに、これはコードで簡単に修正できます。_conexaoローカル変数を作成するだけですdoPost()


実際に答えBufferedReaderてみInputStreamPreparedStatementください。このコードを省略しようとしましたか? さらに、BufferedReader( in.close()) を閉じています。これは、基になるリソース、つまりInputStream.


そして、質問とは無関係のさらに別の提案: 本当に正当な理由がない限り、ODBC の代わりに MySQL ドライバーを使用します。

暴言を吐いて申し訳ありません。さらに助けが必要な場合は、いつでも会話を受け付けています。これで頑張ってください!

于 2013-12-02T12:51:42.923 に答える
0

問題は ODBC-JDBC ブリッジでした。MySQL ドライバーを使用したところ、問題なく動作しました。

ニコスのヒントをありがとう!

于 2013-12-02T21:33:06.473 に答える