質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Q&A

解決済

1回答

6227閲覧

Servlet & Jsp で Mysql に画像を保存したい

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

0グッド

1クリップ

投稿2019/06/09 07:59

編集2019/06/10 00:37

前提・実現したいこと

表題の通りで
「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)

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

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

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

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

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

guest

回答1

0

ベストアンサー

HTML(ないしはJSPなど)からJavaのWebアプリケーションへファイルをアップロードする場合は、「サーブレットにアップロード用の設定である MuiliPartConfig」が必要です。

以下は、単一のアップロードファイルを受け取るサーブレット仕様3.0以降の例です。

java

1import java.io.IOException; 2 3import javax.servlet.ServletException; 4import javax.servlet.annotation.MultipartConfig; 5import javax.servlet.annotation.WebServlet; 6import javax.servlet.http.HttpServlet; 7import javax.servlet.http.HttpServletRequest; 8import javax.servlet.http.HttpServletResponse; 9import javax.servlet.http.Part; 10 11/** 12 * Servlet implementation class UploadServlet 13 */ 14@WebServlet("/UploadServlet") 15@MultipartConfig(location = "/test") 16public class UploadServlet extends HttpServlet { 17 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 18 Part part = request.getPart("filename"); 19 String name = this.getFileName(part); 20 21 String uploadDir = getServletContext().getRealPath("/upload"); 22 part.write(uploadDir + "/" + name); 23 response.sendRedirect("upload.jsp"); 24 } 25 26 private String getFileName(Part part) { 27 String name = null; 28 for (String dispotion : part.getHeader("Content-Disposition").split(";")) { 29 if (dispotion.trim().startsWith("filename")) { 30 name = dispotion.substring(dispotion.indexOf("=") + 1).replace("\"", "").trim(); 31 name = name.substring(name.lastIndexOf("\") + 1); 32 break; 33 } 34 } 35 return name; 36 } 37} 38

アップロードするファイルを filename で送信するJSPを念のため。

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="UploadServlet" enctype="multipart/form-data" method="post"> 11画像: 12<input type="file" name="filename"/><br> 13<input type="submit" value="送信"> 14</form> 15</body> 16</html>

サーブレットのみでアップロードを実現すると、このようにやや複雑な実装になってしまうため、Commons-upload https://commons.apache.org/proper/commons-fileupload/using.html を利用する手もあります。

https://www.google.com/search?q=Servlet3.0+%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89&oq=Servlet3.0+%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89&aqs=chrome..69i57.4252j0j7&sourceid=chrome&ie=UTF-8

投稿2019/06/09 10:14

A-pZ

総合スコア12011

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

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

退会済みユーザー

退会済みユーザー

2019/06/10 00:23 編集

ご回答ありがとうございます。 ご教示の通り@MuiliPartConfig を追記し情報取得はできているようですが、 依然同じ例外が出ます。 おそらく、他にpathを取得しているあたりで、問題があるのだろうと思いあたりました。 アノテーションを加えるだけだは、同じ状況だった為、 今回頂いたソースコードを参考に、フォームから取得したファイル情報を ・getParameter()で取得   → java.io.のFileインスタンス生成   →DAOで、FileからFileInputStreamに変えて    PreparedStatementのsetBynaryStream() という流れから、前半を ・getPart()で取得   →String  →File型 に変えて実行すると、例外のメッセージに ”img-landscape-200x300.jpg (No such file or directory)” が表示されるようになりました。 載せているソースコードでは部分的ですが、実は、 投稿サイトのようなアプリケーションの中で使用したく、 フォームから取得する情報は、クライアントを想定してます。 初心者すぎる質問で恐縮ですが、 この場合、 ・フルパスを取得してクライアントのディレクトリへ画像ファイル」を取りに行くのではなく、  (逆に自身のディレクトリからの場合は、この順序になるのでしょうか?) ・「サーバにUploadされた画像ファイル」を取得する という見解で正しいのでしょうか。 もし、そうであれば、 ・input で取得できる情報の範囲・型 (自分の認識では、ファイル・ディレクトリ名) と、それに対し、 DBにinsertするために必要な情報は何なのか。 又、その情報はどのような流れで取得すべきか。 ・servlet&jsp <-> db 間で画像ファイルを扱う場合、  Blob型に変換するまでの流れはどのようになっているのか。 が分かればできる気がするのですが、 調べてみたもののパスや型変換のあたりが混乱していることで、 最適な方法が分からなくなっています。 最終的に、DBから画像を取得して、ブラウザに表示できるようにするまでに 必要な情報(元)をいただければ幸いです。 初心者の意味のわからない質問で申し訳ありませんが、 どうぞよろしくお願いいたします。
A-pZ

2019/06/10 05:34

はい、サーバから直接クライアントのファイル情報は取得できませんので、formから送信されたファイル情報とファイルそのものをサーバで扱います。実際にアップロードされたファイルは、part.write(uploadDir + "/" + name); で指定したディレクトリに配置されます。 アップロードされたディレクトリのフルパスを指定してFileオブジェクトを取得すれば、あとは動作するかと思います。
退会済みユーザー

退会済みユーザー

2019/06/11 07:16

申し訳ありません、1点だけ教えていただきたいのですが、 servlet line:21 .getRealPath("/upload"); の"/upload"はどこからの仮想パスなのでしょうか? 度々すみませんが、よろしくお願いします。
A-pZ

2019/06/13 09:01

この場合は、Webアプリケーション直下のパスです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問