🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

INSERT

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

1022閲覧

テキストファイル の読み込み

kjrk

総合スコア15

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

INSERT

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2021/01/06 03:25

前提・実現したいこと

今回実現したいプログラムは、
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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

java

1while((str = br.readLine()) != null) { 2   ps.setString(1, str); 3}

この書き方だとパラメータ1の値を上書きし続けています。
残るのは最後のreadLineだけ。起きてる現象と一致しますね。

strを全てappendしたStringを渡せば良いのでは。

例:

java

1String br = System.getProperty("line.separator"); 2StringBuilder contentStr = new StringBuilder(); 3while((str = br.readLine()) != null) { 4   contentStr.append(str+br); 5} 6ps.setString(1,contentStr.toString());

投稿2021/01/06 03:51

m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kjrk

2021/01/06 04:21

有難うございます。 解決できました。
m.ts10806

2021/01/06 04:25

1行ずつ追っていけば(デバッグ) 見えてくるものもあるかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問