※ ChatGPTを利用し、要約された質問です(原文:MySQLへバイナリデータを挿入する際にエラー)
MySQLへバイナリデータを挿入する際にエラー
このQ&Aのポイント
サーブレットを使用してMySQLへバイナリデータを挿入する際に、「java.lang.AbstractMethodError: org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.setBlob(ILjava/io/InputStream;J)V」というエラーが発生しています。
エラーメッセージがSQLのエラーではないことから、setBlobとsetBinaryStreamの両方を試しても同じエラーが発生し、原因がわかりません。
ファイルのアップロードはうまくいくが、MySQLへの挿入処理でエラーが発生しています。解決策がわかる方がいれば教えてください。
現在、サーブレットの勉強をしています。
ブラウザからファイルアップロードをするプログラムを組んでおり、Jakartaプロジェクトのcommons FileUploadを使っています。通常のファイルへ書き込むwriteを使うやり方はうまく行くのですが、MySQLに挿入しようとすると以下のエラーが出ます。ただ、MySQLの接続についてはできることを確認済みです。
「java.lang.AbstractMethodError: org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.setBlob(ILjava/io/InputStream;J)V」
また、MySQLには以下のような構成でfileという名前のテーブルを作ってあります。
id INT型 auto_increment
file BLOB型
filename VarChar型
プログラムは以下のようにしてあります。(一部省略)
if (ServletFileUpload.isMultipartContent(request)) {
DiskFileItemFactory dfif = new DiskFileItemFactory();
ServletFileUpload sfu = new ServletFileUpload(dfif);
FileItem fi = null;
try {
ListIterator li = sfu.parseRequest(request).listIterator();
InitialContext ic = new InitialContext();
DataSource ds = (DataSource)ic.lookup("java:comp/env/jdbc/MySQL");
Connection db = ds.getConnection();
while (li.hasNext()) {
fi = (FileItem)li.next();
if (!fi.isFormField()) {
String filename = fi.getName();
String mime = fi.getContentType();
if ((filename != null) && (!filename.equals(""))) {
filename = (new File(filename)).getName();
}
PreparedStatement ps = db.prepareStatement("INSERT INTO `file` (`file`, `filename`) VALUES (?, ?");
ps.setBlob(1, fi.getInputStream(), fi.getSize());
//ps.setBinaryStream(1, fi.getInputStream(), fi.getSize());
ps.setString(2, filename);
ps.executeUpdate();
ps.close();
db.close();
ic.close();
}}}}
setBlobとsetBinaryStreamの両方を試してみたものの、同じエラーになりました。また、executeUpdate()をコメントアウトしてもエラーが出るので、SQLのエラーではないような気がします。エラーについても検索してみてもあまりヒットせず、何が悪いのかよくわからない状態です。
何か気付いた点があれば教えてください。
お礼
回答ありがとうございます。いろいろと試してみたのですが、 ps.setBlob(1, fi.getInputStream(), fi.getSize()); //ps.setBinaryStream(1, fi.getInputStream(), fi.getSize()); この部分でエラーが出ていたので 、 ps.setBytes(1, fi.get()); としたところうまく行きました。