Javaで読み込んだテキストをDBにINSERTする際に送信エラーが起きる原因がわかりません。
Q&A
Closed
解決したいこと
WEBアプリとしてテキストファイルをアップロード可能な画面を用意し、
上記のテキストファイルをサーバ側のJAVAプログラムで読み込み、
一連のルールに従って、内容をDBに保存して、
完了画面をクライアントに返すプログラムを作ろうとしているのですが、
ファイルを選択し、アップロードする際に、エラーになります。
処理の流れとしましては、
ファイルの受け取り、
ファイルの保存、
保存先のファイルをオブジェクト化、
ファイルの読み取り、
テーブルに保存、
という流れです。
処理の中で確認できていますのは、
ファイルの読み取り(複数行の場合うまくいっているかの確認はできていません。)までです。
おそらくテーブルにINSERTする際にエラーになっているのですが、
詳細なエラー内容が表示されないため困っています。
下記にソースを添付いたしました。
1つ目がメインとなるServletのクラス
2つ目がファイル関連の処理を書いた、Logicクラス
3つ目がDB関連の処理を書いた、Daoクラス
になります。
3つ目のDaoクラスの63行目の
ps.setString(1, contentStr.toString());
が怪しいとは思っているのですが、解決できません。
contentStrは、
読み込んだテキスト(str)とカンマ(,)を、
テキストが読み込めなくなるまで付け足したものです。
StringBuilder contentStr = new StringBuilder();
while(str != null) {
contentStr.append(str);
contentStr.append(comma);
}
どうかお力添え下さい。
発生している問題・エラー
このページは動作していません 118.**.**.** からデータが送信されませんでした。
ERR_EMPTY_RESPONSE
該当するソースコード
import java.io.File;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
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;
import logic.FileLogic;
/**
*
* 初期画面の表示、
* ファイル関連の処理を実行させるクラス
* @author
*
*/
@WebServlet("/MainServlet")
@MultipartConfig(maxFileSize = 20971520, maxRequestSize = 20971520, fileSizeThreshold = 1048576, location = "/opt/apache-tomcat-8.5.61/temp")
public class MainServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* doGet()
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 初期画面をフォワード
RequestDispatcher dispatcher = request.getRequestDispatcher("/jsp/input.jsp");
dispatcher.forward(request, response);
}
/**
* doPost()
* @throws IOException
* @throws ServletException
*/
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
// 文字コード指定
response.setContentType("text/html; charset=UTF-8");
// 文字列出力用のストリームを出力するためにPrintWriterオブジェクトを取得
// PrintWriter out = response.getWriter();
// Partオブジェクトの取得
Part part =request.getPart("uploadFile");
// FileLogicクラスをインスタンス化
FileLogic fileLogic = new FileLogic();
// アップロードされたファイル名の取得
String fileName = fileLogic.getFileName(part);
// ファイルパスの指定
String filePath = "/uploaded";
// ディレクトリーの作成
File uploadDir = fileLogic.mkdirs(filePath);
String AbsolutePath = getServletContext().getRealPath(uploadDir.getPath() + "/" + fileName);
fileLogic.execute(part, AbsolutePath);
// 初期画面をフォワード
// RequestDispatcher dispatcher = request.getRequestDispatcher("/jsp/output.jsp");
// dispatcher.forward(request, response);
}
}
package logic;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.SQLException;
import javax.servlet.http.Part;
import dao.UploadedFileDao;
/**
*
* ファイルの処理に関するクラス
* @author kijima
*
*/
public class FileLogic {
/**
* ファイルの処理
*/
public void execute(Part part, String AbsolutePath) {
// 指定されたパスにファイルを保存
try {
part.write(AbsolutePath);
} catch (IOException e) {
// FileUnsavedError
e.printStackTrace();
}
// ファイルオブジェクトの生成
File file = new File(AbsolutePath);
// ファイルの読み込みを実行
readFile(file);
}
/**
* ファイル読み込みを実行するメソッド
* @return ファイル読み取ったもの
* @throws IOException
* @throws SQLException
* @throws ClassNotFoundException
* @throws IllegalAccessException
* @throws InstantiationException
*/
public void readFile(File file) {
// ファイルのチェック
// エラーが出た時(例外処理)
// ファイルを1文字ずつ読み込む
FileReader fileReader = null;
try {
fileReader = new FileReader(file);
} catch (FileNotFoundException e) {
// FileReaderError
e.printStackTrace();
}
// ファイルを1行ずつ読み込む
BufferedReader bufferedReader = new BufferedReader(fileReader);
// INSERTするテキストを抽出
String str = null;
try {
str = bufferedReader.readLine();
} catch (IOException e) {
// BufferedReaderError
e.printStackTrace();
}
String comma = " , ";
StringBuilder contentStr = new StringBuilder();
while(str != null) {
contentStr.append(str);
contentStr.append(comma);
}
// DB処理に関するオブジェクトを取得
UploadedFileDao dao = new UploadedFileDao();
// テーブルにレコードを追加するメソッドの呼び出し
dao.insert(contentStr.toString());
}
/**
* ファイル名を取得するメソッド
*/
public String getFileName(Part part) {
String name = null;
for (String dispotion : part.getHeader("Content-Disposition").split(";")) {
if(dispotion.trim().startsWith("filename")) {
name = dispotion.substring(dispotion.indexOf("=") + 1).replace("\"", "").trim();
name = name.substring(name.lastIndexOf("\\") + 1);
break;
}
}
return name;
}
/**
* ディレクトリーの作成をするメソッド
*/
public File mkdirs(String filePath) {
File uploadDir = new File(filePath);
uploadDir.mkdirs();
return uploadDir;
}
}
package dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
*
* DB処理に関するクラス
* @author kijima
*
*/
public class UploadedFileDao {
// DB接続に使用する情報
public final String url = "jdbc:mariadb://localhost/upload_db";
public final String user = "****";
public final String password = "****";
public final String insertSql = "INSERT INTO `upload_file` (`contents`) VALUES (?)";
/**
* テキストデータをINSERT
* @throws ClassNotFoundException
* @throws IllegalAccessException
* @throws InstantiationException
* @throws SQLException
*/
public void insert(String contentStr) {
// JDBCドライバをロード
try {
Class.forName("org.mariadb.jdbc.Driver").newInstance();
} catch (InstantiationException e) {
// JdbcUnloadedError
e.printStackTrace();
} catch (IllegalAccessException e) {
// JdbcUnloadedError
e.printStackTrace();
} catch (ClassNotFoundException e) {
// JdbcUnloadedError
e.printStackTrace();
}
// DB接続
Connection conn = null;
try {
conn = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
// NoConectedError
e.printStackTrace();
}
// SQL文の準備・実行
PreparedStatement ps = null;
try {
ps = conn.prepareStatement(insertSql);
} catch (SQLException e) {
// UnprepareStatementError
e.printStackTrace();
}
try {
ps.setString(1, contentStr.toString());
} catch (SQLException e) {
// UnsetStringError
e.printStackTrace();
}
try {
ps.executeUpdate();
} catch (SQLException e) {
// UnupdatedError
e.printStackTrace();
}
// DBの更新と切断
try {
conn.commit();
} catch (SQLException e) {
// UnComittedError
e.printStackTrace();
}
try {
conn.close();
} catch (SQLException e) {
// UnclosedError
e.printStackTrace();
}
}
}
補足情報
VPSを作成し、その中にtomcatをインストールし、
tomcatで動かそうとしています。