ryon_kiji
@ryon_kiji (木嶋 遼介)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Javaで読み込んだテキストをDBにINSERTする際に送信エラーが起きる原因がわかりません。

解決したいこと

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で動かそうとしています。

0

1Answer

以下の部分が無限ループになっているため、サーバからの応答がなくなったように見えるのではないでしょうか? (ループ中にstrが更新されない、つまりstrnullになることがない)

while(str != null) {
    contentStr.append(str);
    contentStr.append(comma);
}

ファイルを一行一行読み込んで、その結果を,で結合したいのであれば、以下のように実装すればよいかと思います。

BufferedReader bufferedReader = new BufferedReader(fileReader); 
String comma = " , ";
StringBuilder contentStr = new StringBuilder();
String str;
while ((str = bufferedReader.readLine()) != null) {
    contentStr.append(str);
    contentStr.append(comma);
}
1Like

Comments

  1. @ryon_kiji

    Questioner

    丁寧なご解説ありがとうございます。
    正常に動作の方確認できました。

Your answer might help someone💌