前提・実現したいこと
WEBとしてテキストファイルをアップロード可能な画面を用意する。
上記のテキストファイルをサーバ側のJAVAプログラムで読み込み
一連のルールに従って、内容をDBに保存して、完了画面をクライアントに返すプログラム
こちらを作ろうとしているのですが、受け取ったテキストファイルの中身を読みこみ、
DBに保存しようとしているのですが、アップロード画面から送信をしようとした際にエラーになります。
一つのクラスで書いているときにはうまくいっているのですが、
DB関連の処理をDaoクラスにまとめて、複数のクラスからなるプログラムにしようとすると
うまくいきません。うまくいかない原因を知りたいです。
発生している問題・エラーメッセージ
このページは動作していません localhostからデータが送信されませんでした。 ERR_EMPTY_RESPONSE
該当のソースコード
jsp
1<%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3<!DOCTYPE html> 4<html> 5<head> 6<meta charset="UTF-8"> 7<title>Insert title here</title> 8</head> 9<body> 10 <form action="/FileInputOutputApp/MainServlet" enctype="multipart/form-data" accept=".txt" method="POST" required> 11 アップロードするテキストファイルを選択してください<br> 12 <input type="file" name="uploadFile"><br> 13 <input type="submit" value="upload"> 14 </form> 15</body> 16</html> 17
Java
1import java.io.BufferedReader; 2import java.io.File; 3import java.io.FileReader; 4import java.io.IOException; 5import java.sql.SQLException; 6 7import javax.servlet.RequestDispatcher; 8import javax.servlet.ServletException; 9import javax.servlet.annotation.MultipartConfig; 10import javax.servlet.annotation.WebServlet; 11import javax.servlet.http.HttpServlet; 12import javax.servlet.http.HttpServletRequest; 13import javax.servlet.http.HttpServletResponse; 14import javax.servlet.http.Part; 15 16import model.FileDao; 17 18/** 19 * 20 * @author 21 * mainServlet 22 * 23 */ 24@WebServlet("/MainServlet") 25@MultipartConfig(maxFileSize = 20971520, maxRequestSize = 20971520, fileSizeThreshold = 1048576, location = "/opt/apache-tomcat-8.5.61/temp") 26public class MainServlet extends HttpServlet { 27 private static final long serialVersionUID = 1L; 28 29 /** 30 * doGet() 31 */ 32 @Override 33 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 34 35 // フォワード 36 RequestDispatcher dispatcher = request.getRequestDispatcher("/jsp/input.jsp"); 37 dispatcher.forward(request, response); 38 39 } 40 41 /** 42 * doPost() 43 */ 44 @Override 45 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 46 47 // 文字コード指定 48 response.setContentType("text/html; charset=UTF-8"); 49 50 // Partオブジェクトの取得 51 Part part = request.getPart("uploadFile"); 52 53 // アップロードされたファイル名の取得 54 String fileName = getFileName(part); 55 56 // ファイルパスの指定 57 String filePath = "/uploaded"; 58 59 // ディレクトリーの作成 60 File uploadDir = mkdirs(filePath); 61 62 // 指定されたパスにファイルを保存 63 part.write(getServletContext().getRealPath(uploadDir.getPath() + "/" + fileName)); 64 65 // ファイルクラスの生成 66 File file = new File(getServletContext().getRealPath(uploadDir.getPath() + "/" + fileName)); 67 68 // ファイルを1文字ずつ読み込む 69 FileReader fileReader = new FileReader(file); 70 71 // ファイルを1行ずつ読み込む 72 @SuppressWarnings("resource") 73 BufferedReader bufferedReader = new BufferedReader(fileReader); 74 String str = bufferedReader.readLine(); 75 String br = System.getProperty("line.separator"); 76 StringBuilder contentStr = new StringBuilder(); 77 78 // DBに接続・テーブルにテキストをINSERT 79 FileDao fileDao = new FileDao(); 80 try { 81 fileDao.create(contentStr, str, br); 82 } catch (SQLException e) { 83 e.printStackTrace(); 84 } catch (InstantiationException e) { 85 e.printStackTrace(); 86 } catch (IllegalAccessException e) { 87 e.printStackTrace(); 88 } catch (ClassNotFoundException e) { 89 e.printStackTrace(); 90 } 91 } 92 93 /** 94 * ディレクトリーの作成をするメソッド 95 */ 96 private File mkdirs(String filePath) { 97 File uploadDir = new File(filePath); 98 uploadDir.mkdirs(); 99 return uploadDir; 100 } 101 102 /** 103 * ファイル名を取得するメソッド 104 */ 105 private String getFileName(Part part) { 106 String name = null; 107 for (String dispotion : part.getHeader("Content-Disposition").split(";")) { 108 if(dispotion.trim().startsWith("filename")) { 109 name = dispotion.substring(dispotion.indexOf("=") + 1).replace("\"", "").trim(); 110 name = name.substring(name.lastIndexOf("\") + 1); 111 break; 112 } 113 } 114 return name; 115 } 116 117 118} 119 120
Java
1package model; 2 3import java.sql.Connection; 4import java.sql.DriverManager; 5import java.sql.PreparedStatement; 6import java.sql.SQLException; 7 8/** 9 * 10 * @author kijima 11 * SQL処理の関連をまとめたクラス 12 * 13 */ 14 public class FileDao { 15 16 // DB接続に使用する情報 17 private final String url = "jdbc:mariadb://localhost/upload_db"; 18 private final String user = "****"; 19 private final String password = "****"; 20 21 Connection conn = null; 22 PreparedStatement ps = null; 23 24 /** 25 * DBにテキストデータをINSERT 26 * @throws ClassNotFoundException 27 * @throws IllegalAccessException 28 * @throws InstantiationException 29 */ 30 public void create(StringBuilder contentStr, String str, String br) throws SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException { 31 32 // JDBCドライバのロード 33 Class.forName("org.mariadb.jdbc.Driver").newInstance(); 34 35 // DB接続 36 conn = DriverManager.getConnection(url, user, password); 37 38 //INSERT文の準備 39 String insertSql = "INSERT INTO `upload_file` (`contents`) VALUES (?)"; 40 ps = conn.prepareStatement(insertSql); 41 while(str != null) { 42 contentStr.append(str+br); 43 } 44 ps.setString(1, contentStr.toString()); 45 46 ps.executeUpdate(); 47 conn.commit(); 48 49 // DB接続切断 50 conn.close(); 51 } 52 53 54} 55
補足情報
以下は動作確認できているクラスです
Java
1import java.io.BufferedReader; 2import java.io.File; 3import java.io.FileReader; 4import java.io.IOException; 5import java.io.PrintWriter; 6import java.sql.Connection; 7import java.sql.DriverManager; 8import java.sql.PreparedStatement; 9import java.sql.ResultSet; 10import java.sql.SQLException; 11import java.sql.Statement; 12 13import javax.servlet.RequestDispatcher; 14import javax.servlet.ServletException; 15import javax.servlet.annotation.MultipartConfig; 16import javax.servlet.annotation.WebServlet; 17import javax.servlet.http.HttpServlet; 18import javax.servlet.http.HttpServletRequest; 19import javax.servlet.http.HttpServletResponse; 20import javax.servlet.http.Part; 21 22/** 23 * 24 * @author 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 RequestDispatcher dispatcher = request.getRequestDispatcher("/jsp/input.jsp"); 39 dispatcher.forward(request, response); 40 41 } 42 43 /** 44 * doPost() 45 */ 46 @Override 47 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 48 49 response.setContentType("text/html; charset=UTF-8"); 50 51 Connection conn = null; 52 PreparedStatement ps = null; 53 54 String url = "jdbc:mariadb://localhost/upload_db"; 55 String user = "****"; 56 String password = "****"; 57 String insertSql = "INSERT INTO `upload_file` (`contents`) VALUES (?)"; 58 59 Part part = request.getPart("uploadFile"); 60 61 String fileName = getFileName(part); 62 63 String filePath = "/uploaded"; 64 65 File uploadDir = mkdirs(filePath); 66 67 part.write(getServletContext().getRealPath(uploadDir.getPath() + "/" + fileName)); 68 69 File file = new File(getServletContext().getRealPath(uploadDir.getPath() + "/" + fileName)); 70 71 FileReader fileReader = new FileReader(file); 72 73 @SuppressWarnings("resource") 74 BufferedReader bufferedReader = new BufferedReader(fileReader); 75 String str; 76 77 try { 78 79 Class.forName("org.mariadb.jdbc.Driver").newInstance(); 80 81 conn = DriverManager.getConnection(url, user, password); 82 83 ps = conn.prepareStatement(insertSql); 84 85 String br = System.getProperty("line.separator"); 86 StringBuilder contentStr = new StringBuilder(); 87 while((str = bufferedReader.readLine()) != null) { 88 contentStr.append(str+br); 89 } 90 ps.setString(1,contentStr.toString()); 91 ps.executeUpdate(); 92 System.out.println("アップロードされたファイルのテキストをデータベースに保存しました<br>"); 93 94 conn.commit(); 95 96 }catch (ClassNotFoundException e){ 97 System.out.println("ClassNotFoundException:" + e.getMessage()); 98 }catch (SQLException e){ 99 System.out.println("SQLException:" + e.getMessage()); 100 }catch (Exception e){ 101 System.out.println("Exception:" + e.getMessage()); 102 }finally{ 103 try{ 104 if (conn != null){ 105 conn.close(); 106 }else{ 107 System.out.println("コネクションがありません"); 108 } 109 }catch (SQLException e){ 110 System.out.println("SQLException:" + e.getMessage()); 111 } 112 } 113 } 114}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/07 02:50
2021/01/07 02:53