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

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

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

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

JSP

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

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

servlet

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

Q&A

解決済

2回答

90737閲覧

JSPで画像やファイル(pdfなど)を入力し、それをDBに登録したあとに呼び出して画面表示する方法が知りたいです。

inamura

総合スコア8

MySQL

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

JSP

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

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

servlet

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

0グッド

1クリップ

投稿2017/07/13 06:00

###JavaとMySQLについてです
勉強のために、webアプリケーションで簡単なネット掲示板を作成しています。

コメントなどメッセージのやり取りをする機能は実装できていて、
メッセージとともに画像や添付ファイルも投稿できるような機能を作りたいのですがなかなかうまくできません。

流れとしてはJSP→servlet→DB→servlet→JSPというように、
JSPで画像を入力→servletで受取りDBに登録→別のservletでテーブルのレコードを全て取得→JSPで全て表示、という形になっています。

画像をバイナリデータで保存することは出来ているのですが、それを画像ファイルに復元する方法がよくわかりません。

方法を教えてください。
出来ればですが、サンプルコードなども提示していただけると幸いです。

宜しくお願い致します。

###入力JSP

Java

1<%@page contentType="text/html" pageEncoding="UTF-8"%> 2<!DOCTYPE html> 3<html> 4 <head> 5 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 6 <title>ImageUploader</title> 7 </head> 8 <body> 9 <Div Align="center"> 10 <h1>画像のアップロード</h1> 11 <form method="POST" action="FileUploadDbServlet" enctype="multipart/form-data"> 12 <table> 13 <tr> 14 <td>ファイル名: </td> 15 <td><input type="text" name="name" size="30" /></td> 16 </tr> 17 <tr> 18 <td>画像 : </td> 19 <td><input type="file" name="image" size="30" /></td> 20 </tr> 21 <tr> 22 <td colspan="2"> 23 <input type="submit" value="送信"> 24 </td> 25 </tr> 26 </table> 27 <br><br> 28 </form> 29 <input type="button" value="show" onclick="location.href='ShowImage'" style="WIDTH:100px; HEIGHT:50px"> 30 </Div> 31 </body> 32</html>

###登録servlet

java

1package servlet; 2 3import java.io.IOException; 4import java.io.InputStream; 5import java.sql.Connection; 6import java.sql.DriverManager; 7import java.sql.Statement; 8 9import javax.servlet.ServletContext; 10import javax.servlet.ServletException; 11import javax.servlet.annotation.MultipartConfig; 12import javax.servlet.annotation.WebServlet; 13import javax.servlet.http.HttpServlet; 14import javax.servlet.http.HttpServletRequest; 15import javax.servlet.http.HttpServletResponse; 16import javax.servlet.http.Part; 17 18/** 19 * Servlet implementation class FileUploadDbServlet 20 */ 21@WebServlet("/FileUploadDbServlet") 22@MultipartConfig(maxFileSize = 2147483647) 23public class FileUploadDbServlet extends HttpServlet { 24 private static final long serialVersionUID = 1L; 25 26 /** 27 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 28 */ 29 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 30 request.setCharacterEncoding("UTF-8"); 31 ServletContext sc = getServletContext(); 32 Connection con = null; 33 34 //ファイル名の取得 35 String name = request.getParameter("name"); 36 //画像ストリームの取得 37 InputStream is= null; 38 Part filePart = request.getPart("image"); 39 if (filePart != null) { 40 is = filePart.getInputStream(); 41 } 42 try { 43 44 // DBコネクションの取得 45 Class.forName("com.mysql.jdbc.Driver"); 46 con = DriverManager.getConnection( 47 "jdbc:mysql://host/DB","user","pass"); 48 Statement st=null; 49 st = con.createStatement(); 50 51 String rs ="INSERT INTO image(name,img) VALUES('"+ name +"','"+ is +"')"; 52 st.executeUpdate(rs); 53 54 55 // DBコネクションのクローズ 56 if(con!=null) con.close(); 57 58 // 登録後画面に飛ぶ 59 sc.getRequestDispatcher("/ShowImage").forward(request, response); 60 61 } catch (Exception e) { 62 e.printStackTrace(); 63 } finally{ 64 } 65 } 66 67} 68

###表示用servlet

java

1package servlet; 2 3import java.io.IOException; 4import java.sql.Connection; 5import java.sql.DriverManager; 6import java.util.ArrayList; 7 8import javax.servlet.ServletContext; 9import javax.servlet.ServletException; 10import javax.servlet.annotation.WebServlet; 11import javax.servlet.http.HttpServlet; 12import javax.servlet.http.HttpServletRequest; 13import javax.servlet.http.HttpServletResponse; 14import javax.servlet.http.HttpSession; 15 16/** 17 * Servlet implementation class ShowImage 18 */ 19@WebServlet("/ShowImage") 20public class ShowImage extends HttpServlet { 21 private static final long serialVersionUID = 1L; 22 23 /** 24 * @see HttpServlet#HttpServlet() 25 */ 26 public ShowImage() { 27 super(); 28 // TODO Auto-generated constructor stub 29 } 30 31 /** 32 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 33 */ 34 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 35 request.setCharacterEncoding("UTF-8"); 36 ServletContext sc = getServletContext(); 37 Connection con = null; 38 ArrayList aList = new ArrayList(); 39 HttpSession session = request.getSession(); 40 41 try { 42 43 // DBコネクションの取得 44 Class.forName("com.mysql.jdbc.Driver"); 45 con = DriverManager.getConnection( 46 "jdbc:mysql://host/db","user","pass"); 47 48 // ユーザーコードの取得 49 String sqlStatement = "SELECT * FROM image"; 50 // JavaBeanの実行 51 model.Bean myBean = new model.Bean(); 52 myBean.setCon(con); 53 myBean.setSqlStatement(sqlStatement); 54 myBean.image(); 55 // 結果の取得 56 aList = myBean.getResult(); 57 // 結果のセット 58 session.setAttribute("image", aList); 59 60 // DBコネクションのクローズ 61 if(con!=null) con.close(); 62 63 // 登録後画面に飛ぶ 64 sc.getRequestDispatcher("/WEB-INF/JSP/ShowImage.jsp").forward(request, response); 65 66 } catch (Exception e) { 67 e.printStackTrace(); 68 } finally{ 69 } 70 } 71

###表示用JSP

java

1<%@page contentType="text/html" pageEncoding="UTF-8"%> 2<%@ page import="java.util.*" %> 3<% 4 ArrayList image = new ArrayList(); 5 image = (ArrayList)session.getAttribute("image"); 6%> 7<!DOCTYPE html> 8<html> 9 <head> 10 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 11 <title>Show Image</title> 12 </head> 13 <body> 14 <Div Align="center"> 15 <h1>格納されているもの</h1> 16 <br><br> 17 <table border=1> 18 <% for(int i=0;i<image.size();i++){ %> 19 <% if(i==0 || i%3==0){ %> 20 <tr> 21 <% } %> 22 <td> 23 <%= image.get(i) %> 24 </td> 25 <% } %> 26 </table> 27 </Div> 28 </body> 29</html>

###試したこと
DBにバイナリデータを保存するまでと、そのままのデータをJSP上に表示することまでは出来ていると思います(正しいのかは別)

このデータを画像として表示する方法が分かりません。

###補足情報(言語/FW/ツール等のバージョンなど)
eclipse
MySQL
Tomcat

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

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

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

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

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

guest

回答2

0

ベストアンサー

実現方法は2つあります。扱う画像ファイルのサイズが数キロバイトを超える場合は、1の方法、そうでない場合は2の方法を検討してください。

1 検索結果に画像データのバイナリを含めてJSPで表示する方法は、出力するJSPのサイズが非常に大きくなるため、パフォーマンスの劣化が顕著です。別途、指定した画像IDに対して画像をレスポンスするサーブレットを用意し、このサーブレットは画像のみを返すよう作ると良いでしょう。以下のサイトによい実装例と呼び出し方がありますので参考にすると良いでしょうか。


参考サイト:
サーブレット・JSPでDBに登録されている画像を表示


2 画像を出力する際のデータを、BASE64で指定して出力もできます。BASE64への変換方法は、Java8の場合であれば

java

1String image = Base64.getEncoder().encodeToString(バイト配列);

これで変換した文字列を、例えば元の画像がpng形式ならば

html

1<img src="data:image/png;base64,${image}">

のようにすると出力できます。


参考サイト:
小さい画像をbase64をかけてhtml内に埋め込み
Java 8 より導入された java.util.Base64 の利用デモ。

投稿2017/07/14 12:49

A-pZ

総合スコア12011

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

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

inamura

2017/07/18 02:39

回答ありがとうございます。 1の方法を試したのですが、エラーが出てしまいもとの画像を取得できませんでした。 -------エラー----------------------- java.lang.IllegalArgumentException: image == null! at javax.imageio.ImageTypeSpecifier.createFromRenderedImage(ImageTypeSpecifier.java:925) at javax.imageio.ImageIO.getWriter(ImageIO.java:1592) at javax.imageio.ImageIO.write(ImageIO.java:1578) at servlet.GetImageServlet.doGet(GetImageServlet.java:40) at javax.servlet.http.HttpServlet.service(HttpServlet.java:622) at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:94) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:502) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1104) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1519) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1475) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745)
A-pZ

2017/07/18 03:01

スタックトレースの先頭に image == null とでていますので、画像のバイナリがデータベースから取得できていないなどは無いでしょうか。(取得しているソースコードが書かれていませんので正確な回答はできません)
inamura

2017/07/18 04:06

わざわざコメントありがとうございます。 ソースコードは提示していただいた参考サイトの「サーブレット・JSPでDBに登録されている画像を表示 」のコードです。 DBは自分のものに書き換えています。sqlを確認するとnullではないのでないはずはないのですが・・・・・・
A-pZ

2017/07/18 04:55

コードがそのままということですが、そもそもJavaコードからSQLを実行してデータベースから対象の画像ファイルのデータが取得できているかは確認してください。
inamura

2017/07/18 05:32

確認してみましたが、Daoの方ではDBからデータを取れているのですが、サーブレットの BufferedImage img = dao.selectImageById(Integer.parseInt(id)); この文のimgがnullになっているようでした・・・ idにはしっかりと値が入っていました
A-pZ

2017/07/18 05:45

"DBからデータが取得できている"のに値がないのは、ResultSetからカラム名の指定があっていますか? 参考サイトでは、InputStream is = rs.getBinaryStream("IMAGE"); となっていますので、これもお使いのSQLに合わせて修正しましょう。データが取得できているのであれば、あとはデバッグモードを使ってどこまでデータが正しく取れているのかを確認していくと良いかと。
inamura

2017/07/18 07:52

カラム名の指定は修正したので問題ありませんでした。 ResultSetに値が入っているかはwhile文などで確認したため値の取得は出来ていました・・・ しかしデバックモードで確認したところ、下記の文を飛ばして処理されてnullを返していたようでした・・・ なぜこのif文の処理に入らないのかがいまいち理解できず困っています。 ItemDao---------------------------------------- // 結果セットから画像データを取得し、返却する if(rs.next()) { InputStream is = rs.getBinaryStream("img"); BufferedInputStream bis = new BufferedInputStream(is); return ImageIO.read(bis); } --------------------------------------------------------------------
A-pZ

2017/07/18 08:22

それはResultSetがない、つまりSQLで1件もヒットしていないからです。参考サイトで取得する方法は、画像ファイルに対して一意のidを割り振っていますので、SQLへ正しく値が格納されているかを確認した方がよいでしょうか。
inamura

2017/07/18 08:39

私もそう思いSQL文のwhereをなくして全件で実行したり、コンソールに出力してみるなど確認したところ、値が出力されたためResultSetへは値が格納されていました。 ですので、原因がわからなくて困っています。説明不足、説明べたで申し訳ございません。 DBのほうは問題はなかったです。
A-pZ

2017/07/18 08:46

ResultSetへ値が格納されているのにnext() がfalseになるのは、すでに全行フェッチ済みだからではないでしょうか。検索結果の値をフィールドごとに出力して確認していますか?できているのであれば、if (rs.next()) { ..... } の中に入るはずでは?
inamura

2017/07/19 00:44

遅れまして申し訳ないです。 eclipseの再起動とクリーンやtomcatのクリーンを行った結果なぜかif文を通りました・・・ しかしimgがnullのままなので最悪、入力時のバイナリデータへの変換が失敗しているきがしてきました。 ちなみに途中で出力した変数の中身はこんな感じでした・・・ ResultSet rs = com.mysql.jdbc.JDBC42ResultSet@226330 InputStream is = java.io.ByteArrayInputStream@adb398
A-pZ

2017/07/19 01:24

InputStreamの内容を確認した方が良いでしょう。例えばですが、 FileOutputStream fos = new FileOutputStream("出力する画像ファイルのフルパス"); byte buf[] = new byte[256]; int len; BufferedInputStream bis = new BufferedInputStream(istr); while( (len = istr.read(buf)) != -1) { fos.write(buf,0,len); } fos.flush(); fos.close(); などで実際にファイルへ書き出してみるか、コンソールにbyte配列の値を出してみるなどして、出力できるかどうかは確認した方が良いでしょう。
inamura

2017/07/19 04:23

コメントありがとうございます InputStreamの中身を、先ほどのコードなどで確認したところ値がでてきませんでした・・・ つまり入力のバイナリデータへの変換が間違っていた感じなんですかね
A-pZ

2017/07/19 05:14

ないしは、データベースに値が正しく入っていないとかでしょうか。
inamura

2017/07/27 00:54

大変遅くなり申し訳ございません。 画像をバイナリデータに変換する部分のコードが間違っていたみたいでちゃんと変換できていませんでした、コードを書き換えたところちゃんと画像が登録できました。 そのデータでプログラムを動かしたところうまく表示できました! こんな初心者のために色々とありがとうございましたー!
A-pZ

2017/07/27 01:07

グッ d(・ω・
guest

0

正常にバイナリデータが登録されているなら、それを呼び出して
ページ上に流し込むだけです。
ただしバイナリデータだけではWEBデータはmimeがわからないので
DB登録のさいにmimeを別途保存しておき、出力にあわせて
httpヘッダでcontent-typeを出力したのち本体をロードします

投稿2017/07/13 07:26

yambejp

総合スコア114585

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

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

inamura

2017/07/18 00:13

遅くなり大変申し訳ありません。 色々と調べてみたのですがやり方がわかりません。
inamura

2017/07/27 00:55

解決しました。 回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問