前提・実現したいこと
今回実現したいプログラムは、
WEBとしてテキストファイルをアップロード可能な画面を用意する。
上記のテキストファイルをサーバ側のJAVAプログラムで読み込み
一連のルールに従って、内容をDBに保存して、完了画面をクライアントに返すプログラムの作成です。
保存するテキストは、テキストファイルから読み込んだ全ての行のテキストを保存したいです。
発生している問題・エラーメッセージ
テキストファイルを読み込んでDBに保存する際に、 テキストファイルの最初の行しか保存されていなく、 修正後のソースでは、テキストファイル の最後の行しか保存されない現象が起きており、解決できません。
該当のソースコード
Java
1package Servlet; 2 3import java.io.BufferedReader; 4import java.io.File; 5import java.io.FileReader; 6import java.io.IOException; 7 8import javax.servlet.RequestDispatcher; 9import javax.servlet.ServletException; 10import javax.servlet.annotation.MultipartConfig; 11import javax.servlet.annotation.WebServlet; 12import javax.servlet.http.HttpServlet; 13import javax.servlet.http.HttpServletRequest; 14import javax.servlet.http.HttpServletResponse; 15import javax.servlet.http.Part; 16 17import model.FileDao; 18import model.FileNameLogic; 19import model.MkdirLogic; 20 21/** 22 * 23 * @author 24 *(修正前:テキストファイル の最初の1行しかDBに保存されない) 25 * 26 */ 27@WebServlet("/MainServlet") 28@MultipartConfig(maxFileSize = 20971520, maxRequestSize = 20971520, fileSizeThreshold = 1048576, location = "/opt/apache-tomcat-8.5.61/temp") 29public class MainServlet extends HttpServlet { 30 private static final long serialVersionUID = 1L; 31 32 /** 33 * doGet() 34 */ 35 @Override 36 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 37 38 // フォワード 39 RequestDispatcher dispatcher = request.getRequestDispatcher("/jsp/input.jsp"); 40 dispatcher.forward(request, response); 41 42 } 43 44 /** 45 * doPost() 46 */ 47 @Override 48 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 49 50 // 文字コード指定 51 response.setContentType("text/html; charset=UTF-8"); 52 53 Connection conn = null; 54 PreparedStatement ps = null; 55 56 String url = "jdbc:mariadb://localhost/upload_db"; 57 String user = "****"; 58 String password = "****"; 59 String insertSql = "INSERT INTO `upload_file` (`contents`) VALUES (?)"; 60 61 // Partオブジェクトの取得 62 Part part = request.getPart("uploadFile"); 63 64 // アップロードされたファイル名の取得 65 FileNameLogic getFileNameLogic = new FileNameLogic(); 66 String fileName = getFileNameLogic.getFileName(part); 67 68 // ファイルパスの指定 69 String filePath = "/uploaded"; 70 71 // ディレクトリーの作成 72 MkdirLogic mkdirLogic = new MkdirLogic(); 73 File uploadDir = mkdirLogic.mkdirs(filePath); 74 75 // 指定されたパスにファイルを保存 76 part.write(getServletContext().getRealPath(uploadDir.getPath() + "/" + fileName)); 77 78 // ファイルクラスの生成 79 File file = new File(getServletContext().getRealPath(uploadDir.getPath() + "/" + fileName)); 80 81 // ファイルを1文字ずつ読み込む 82 FileReader fileReader = new FileReader(file); 83 84 // ファイルを1行ずつ読み込む 85 @SuppressWarnings("resource") 86 BufferedReader bufferedReader = new BufferedReader(fileReader); 87 String str = bufferedReader.readLine(); 88 89 // DBに接続・テーブルにレコードを追加 90 try { 91 Class.forName("org.mariadb.jdbc.Driver").newInstance(); 92 conn = DriverManager.getConnection(url, user, password); 93 94 ps = conn.prepareStatement(insertSql); 95 ps.setString(1, str); 96 ps.executeUpdate(); 97 out.println("アップロードされたファイルのテキストをデータベースに保存しました<br>"); 98 99 conn.commit(); 100 101 }catch (ClassNotFoundException e){ 102 out.println("ClassNotFoundException:" + e.getMessage()); 103 }catch (SQLException e){ 104 out.println("SQLException:" + e.getMessage()); 105 }catch (Exception e){ 106 out.println("Exception:" + e.getMessage()); 107 }finally{ 108 try{ 109 if (conn != null){ 110 conn.close(); 111 }else{ 112 out.println("コネクションがありません"); 113 } 114 }catch (SQLException e){ 115 out.println("SQLException:" + e.getMessage()); 116 } 117 } 118 } 119} 120 121
試したこと
readlineメソッドでテキストファイルの内容を1行ずつ読み込むメソッドを使う際に、
繰り返しreadLine()メソッドを実行するように該当部分に繰り返しの処理を付け加えました。
Java
1package Servlet; 2 3import java.io.BufferedReader; 4import java.io.File; 5import java.io.FileReader; 6import java.io.IOException; 7 8import javax.servlet.RequestDispatcher; 9import javax.servlet.ServletException; 10import javax.servlet.annotation.MultipartConfig; 11import javax.servlet.annotation.WebServlet; 12import javax.servlet.http.HttpServlet; 13import javax.servlet.http.HttpServletRequest; 14import javax.servlet.http.HttpServletResponse; 15import javax.servlet.http.Part; 16 17import model.FileDao; 18import model.FileNameLogic; 19import model.MkdirLogic; 20 21/** 22 * 23 * @author 24 *(修正後:テキストファイルの最後の1行しかDBに保存されない) 25 * 26 */ 27@WebServlet("/MainServlet") 28@MultipartConfig(maxFileSize = 20971520, maxRequestSize = 20971520, fileSizeThreshold = 1048576, location = "/opt/apache-tomcat-8.5.61/temp") 29public class MainServlet extends HttpServlet { 30 private static final long serialVersionUID = 1L; 31 32 /** 33 * doGet() 34 */ 35 @Override 36 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 37 38 // フォワード 39 RequestDispatcher dispatcher = request.getRequestDispatcher("/jsp/input.jsp"); 40 dispatcher.forward(request, response); 41 42 } 43 44 /** 45 * doPost() 46 */ 47 @Override 48 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 49 50 // 文字コード指定 51 response.setContentType("text/html; charset=UTF-8"); 52 53 Connection conn = null; 54 PreparedStatement ps = null; 55 56 String url = "jdbc:mariadb://localhost/upload_db"; 57 String user = "****"; 58 String password = "****"; 59 String insertSql = "INSERT INTO `upload_file` (`contents`) VALUES (?)"; 60 61 // Partオブジェクトの取得 62 Part part = request.getPart("uploadFile"); 63 64 // アップロードされたファイル名の取得 65 FileNameLogic getFileNameLogic = new FileNameLogic(); 66 String fileName = getFileNameLogic.getFileName(part); 67 68 // ファイルパスの指定 69 String filePath = "/uploaded"; 70 71 // ディレクトリーの作成 72 MkdirLogic mkdirLogic = new MkdirLogic(); 73 File uploadDir = mkdirLogic.mkdirs(filePath); 74 75 // 指定されたパスにファイルを保存 76 part.write(getServletContext().getRealPath(uploadDir.getPath() + "/" + fileName)); 77 78 // ファイルクラスの生成 79 File file = new File(getServletContext().getRealPath(uploadDir.getPath() + "/" + fileName)); 80 81 // ファイルを1文字ずつ読み込む 82 FileReader fileReader = new FileReader(file); 83 84 // ファイルを1行ずつ読み込む 85 @SuppressWarnings("resource") 86 BufferedReader bufferedReader = new BufferedReader(fileReader); 87 String str; 88 89 // DBに接続・テーブルにレコードを追加 90 try { 91 Class.forName("org.mariadb.jdbc.Driver").newInstance(); 92 93 conn = DriverManager.getConnection(url, user, password); 94 95 ps = conn.prepareStatement(insertSql); 96 97 while((str = br.readLine()) != null) { 98 ps.setString(1, str); 99 } 100 br.close(); 101 102 ps.executeUpdate(); 103 out.println("アップロードされたファイルのテキストをデータベースに保存しました<br>"); 104 105 conn.commit(); 106 107 }catch (ClassNotFoundException e){ 108 out.println("ClassNotFoundException:" + e.getMessage()); 109 }catch (SQLException e){ 110 out.println("SQLException:" + e.getMessage()); 111 }catch (Exception e){ 112 out.println("Exception:" + e.getMessage()); 113 }finally{ 114 try{ 115 if (conn != null){ 116 conn.close(); 117 }else{ 118 out.println("コネクションがありません"); 119 } 120 }catch (SQLException e){ 121 out.println("SQLException:" + e.getMessage()); 122 } 123 } 124 } 125} 126 127
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/06 04:21
2021/01/06 04:25