前提・実現したいこと
表題の通りで
「Servlet & Jsp のMVCモデルで Mysql に画像を保存したい」
のですが、うまくいきません。
例外から、getParameter()でフォームの情報を取得して、File型のオブジェクトを生成する時点で、Nullが発覚しているということは、パラメターで取得したStringから、File型にnewするコードが間違っているのでしょうか?
画像の大きさとも考えにくいですし...
格納したい画像はデスクトップに保存している画像で、フォームでFinderから選択しています。
コードはネットで検索したものを書き換えたものですので、
私に非があるのは間違い無いのですが、
何処に問題があるのか、分からなくなってしまいました。
###発生している例外
500 Internal Server Error
タイプ 例外報告
説明 サーバーは予期しない条件に遭遇しました。それはリクエストの実行を妨げます。
例外
java.lang.NullPointerException
java.base/java.io.File.<init>(File.java:276)
servlet.InsertPhoto.doPost(InsertPhoto.java:42)
javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
filter.Filter.doFilter(Filter.java:25)
注意 原因のすべてのスタックトレースは、サーバのログに記録されています
該当のソースコード
java
1package servlet; 2 3import java.io.File; 4import java.io.IOException; 5 6import javax.servlet.RequestDispatcher; 7import javax.servlet.ServletException; 8import javax.servlet.annotation.WebServlet; 9import javax.servlet.http.HttpServlet; 10import javax.servlet.http.HttpServletRequest; 11import javax.servlet.http.HttpServletResponse; 12 13import model.InsertPhotoLogic; 14 15@WebServlet("/InsertPhoto") 16public class InsertPhoto extends HttpServlet { 17 private static final long serialVersionUID = 1L; 18 19 public InsertPhoto() { 20 super(); 21 } 22 23 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 24 25 String path="/WEB-INF/jsp/fileinput.jsp"; 26 27 RequestDispatcher dsp=request.getRequestDispatcher(path); 28 dsp.forward(request, response); 29 30 response.getWriter().append("Served at: ").append(request.getContextPath()); 31 } 32 33 34 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 35 36 String title=request.getParameter("title"); 37 String str=request.getParameter("file"); 38 39 File file=new File(str); 40 InsertPhotoLogic plogic=new InsertPhotoLogic(); 41 plogic.execute(title,file); 42 43 RequestDispatcher dsp=request.getRequestDispatcher("/WEB-INF/jsp/result.jsp"); 44 dsp.forward(request, response); 45 46 doGet(request, response); 47 } 48 49} 50
以下servletの変更した部分です
java
1protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 2 3 String title=request.getParameter("title"); 4 Part part=request.getPart("data"); 5 String name=part.getSubmittedFileName(); 6 7 File file=new File(name); 8 InsertPhotoLogic plogic=new InsertPhotoLogic(); 9 plogic.execute(title,file); 10 11 RequestDispatcher dsp=request.getRequestDispatcher("/WEB-INF/jsp/result.jsp"); 12 dsp.forward(request, response); 13 14 doGet(request, response); 15 } 16 17} 18
java
1package dao; 2 3import java.io.File; 4import java.io.FileInputStream; 5import java.io.FileNotFoundException; 6import java.sql.Connection; 7import java.sql.DriverManager; 8import java.sql.PreparedStatement; 9import java.sql.SQLException; 10 11public class InsertPhotoDAO { 12 private final String DRIVER="com.mysql.jdbc.Driver"; 13 private final String JDBC_URL="jdbc:mysql://localhost/Practice_MVC"; 14 private final String DB_USER="root"; 15 private final String DB_PASS=""; 16 17 public void insertPhotos(String title,File f) throws FileNotFoundException { 18 File file=new File(f.getName()); 19 PreparedStatement ps = null; 20 21 try{ 22 Class.forName(DRIVER); 23 Connection conn=DriverManager.getConnection(JDBC_URL, DB_USER, DB_PASS); 24 String sql ="insert into blob_test(title, file_name, data) values (?, ?, ?)"; 25 26 conn.setAutoCommit(false); 27 ps = conn.prepareStatement(sql); 28 ps.setString(1, title); 29 ps.setString(2, f.getName()); 30 ps.setBinaryStream(3, new FileInputStream(file),(int)file.length()); 31 ps.executeUpdate(); 32 33 conn.commit(); 34 conn.close(); 35 36 } catch (ClassNotFoundException e) { 37 e.printStackTrace(); 38 } catch (SQLException e) { 39 e.printStackTrace(); 40 } 41 } 42 43} 44
java
1package model; 2 3import java.io.File; 4import java.io.IOException; 5import dao.InsertPhotoDAO; 6 7public class InsertPhotoLogic{ 8 9 public void execute(String title,File file) throws IOException{ 10 InsertPhotoDAO dao=new InsertPhotoDAO(); 11 dao.insertPhotos(title,file); 12 } 13}
html
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 ="/test/InsertPhoto" METHOD="post" ENCTYPE="MULTIPART/FORM-DATA"> 11TITLE<INPUT TYPE="text" NAME="title"><BR> 12DATA<INPUT TYPE="file" NAME="data"><BR> 13<INPUT TYPE="submit"> 14</FORM> 15</body> 16</html>
試したこと
https://www.atmarkit.co.jp/ait/articles/0312/16/news002.html
http://d.hatena.ne.jp/hidepon_mory/20070210/1206341433
https://www.studentstutorial.com/java-project/insert-image-in-jsp-servlet.php
...etc
などを参考にさせて頂きました。
他にもいろいろ拝見しましたが、jspのみ、servletのみ、OSの環境が異なるものなどが多かったため、
おそらく、変更すべきところをしていない、などの初歩的なミスで動かなくなったのだと思いますが、それを突き止めるに至っておりません。
どうぞよろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
IDE:Eclipse
Version: 2019-03 (4.11.0)
Mysql:
8.0.16 for osx10.14 on x86_64
OS:Mac OS Mojave
10.14.4(18E226)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/06/10 00:23 編集
2019/06/10 05:34
退会済みユーザー
2019/06/11 07:16
2019/06/13 09:01