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

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

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

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

Java

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

servlet

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

Q&A

解決済

1回答

27942閲覧

DB→servlet→JSP 画像表示について

junpi-ya

総合スコア17

MySQL

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

Java

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

servlet

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

0グッド

0クリップ

投稿2016/05/03 16:55

こんばんは(-"-)
DBから画像データを取得し、JSPで表示するプロジェクトを作成中です。
指定したID番号でに紐づく画像をテーブルから取得したいと思ってます。
以下のソースで実行すると、
「画像ファイル"http://localhost:8080/******は壊れているため、表示できませんでした」
と出てくるのですが、確認した所、画像ファイルに破損は見られず、他の画像ファイルでも試したところ、同様のエラーが出てきました((+_+))

勉強不足で恐縮ですが、解決策がありましたら、ご教授頂けると幸いです。。。

【環境】
・JSP
・Java
・Tomcat
・MYSQL

【テーブル】
imgtable

【カラム】
ID プライマリーキー
filename 画像データの基のファイル名
image 画像データ

servlet

package servlet;

import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import dao.Fileselect;

@WebServlet("/Fileconfirmation")
public class Fileconfirmation extends HttpServlet {
private static final long serialVersionUID = 1L;

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //IDの取得 String ID = request.getParameter("ID"); //取得したIDに紐づく画像データをDBから取得 Fileselect dao = new Fileselect(); BufferedImage BIMG = dao.selectImageById(Integer.parseInt(ID)); //画像を返す response.setContentType("image/jpeg"); OutputStream OS = response.getOutputStream(); ImageIO.write(BIMG, "jpg", OS); OS.flush(); }

}

dao

package dao;

import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.imageio.ImageIO;

public class Fileselect {
private String url = "jdbc:mysql://localhost:3306/test";
private String user = "";
private String passwd = "
";

public BufferedImage selectImageById(int ID){ Connection con = null; try { Class.forName("com.mysql.jdbc.Driver"); con = DriverManager.getConnection(url, user, passwd); //SQL文の作成 String sql = "SELECT FROM `imgtable` WHERE ID = ?;"; //SELECTを実行 PreparedStatement ps = con.prepareStatement(sql); ps.setInt(1, ID); ResultSet rs = ps.executeQuery(); //データの取り出し if(rs.next()){ while(rs.next()){ InputStream is = rs.getBinaryStream("image"); BufferedInputStream bis = new BufferedInputStream(is); return ImageIO.read(bis); } } }catch (IOException | SQLException | ClassNotFoundException e) { e.printStackTrace(); } return null; } }

jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <center> <table border="1" style="border-collapse: collapse"> <tr> <td>ID</td> <td>名前</td> <td>画像</td> </tr> <c:forEach items="${ requestScope.imgtableList }" var="item"> <tr> <td><c:out value="${ imgtable.id }" /></td> <td><c:out value="${ imgtable.faleName }" /></td> <td><img style="width: 100px; height: 100px" src="getImage?id=${ imgtable.id }"></td> </tr> </c:forEach> </table> </center> </body> </html>

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

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

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

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

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

guest

回答1

0

ベストアンサー

提示いただいているソースとほぼ同様のソースで、mysqlと連動させないでservlet部分だけでローカル画像を読み込んで表示させることはできるようです。そのため、mysql周りに問題がありそうです。

「imgtable」テーブルの各項目の定義(型)はどのようになっていますか?
またテーブルへの画像ファイルの登録はどのように行いましたか?
※テーブルのデータ、またはテーブルデータ取得部分に問題がありそうです。

java

1package local.hoge.sample.image.servlet; 2 3import java.awt.image.BufferedImage; 4import java.io.File; 5import java.io.IOException; 6import java.io.OutputStream; 7 8import javax.imageio.ImageIO; 9import javax.servlet.ServletException; 10import javax.servlet.annotation.WebServlet; 11import javax.servlet.http.HttpServlet; 12import javax.servlet.http.HttpServletRequest; 13import javax.servlet.http.HttpServletResponse; 14 15import org.slf4j.Logger; 16import org.slf4j.LoggerFactory; 17 18@WebServlet("/image") 19public class ImageServlet extends HttpServlet { 20 private static final long serialVersionUID = 1L; 21 22 // logger 23 private static final Logger log = LoggerFactory.getLogger(ImageServlet.class); 24 25 // 画像ファイルパス 26 private static final String IMAGE_FILE = ImageServlet.class.getClassLoader().getResource("").getPath(); 27 28 // コンストラクタ 29 public ImageServlet() { 30 super(); 31 } 32 33 34 protected void doGet(HttpServletRequest request, HttpServletResponse response) 35 throws ServletException, IOException { 36 37 log.info("画像パス [{}]", IMAGE_FILE); 38 39 // 画像読み込み 40 BufferedImage bi = ImageIO.read(new File(IMAGE_FILE + "/image.jpeg")); 41 42 // 画像返却 43 response.setContentType("image/jpeg"); 44 OutputStream output = response.getOutputStream(); 45 ImageIO.write(bi, "jpg", output); 46 output.flush(); 47 } 48}

投稿2016/05/04 00:44

takyafumin

総合スコア2335

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

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

junpi-ya

2016/05/04 04:54

ご返信ありがとうございます。 デバッグで確認してみたところ、画像が上手く読み込めておりませんでした。 MYSQLのどのあたりが問題なのでしょうか。。。。 「imgtable」テーブルの定義(型)は、以下で設定しております。 【カラム】 ID (int[1]) filename (varchar[10]) image (blob) また、画像のファイルの登録は、以下のプログラムでINSERTしております。 よろしくお願いいたします。 dao -------------------------------------------------------------------------- public class Fileinsert { private String url = "jdbc:mysql://localhost:3306/test"; private String user = "****"; private String passwd = "*****"; public Fileinsert(String ID, String fileName, Part file) throws IOException{ InputStream inputStream = null; inputStream = file.getInputStream(); Connection con = null; try{//ドライバの読み込み DriverManager.registerDriver(new com.mysql.jdbc.Driver()); con = DriverManager.getConnection(url,user,passwd); String sql = "INSERT INTO imgtable(ID,fileName,image) value(?,?,?)"; PreparedStatement statement = con.prepareStatement(sql); statement.setString(1,ID); statement.setString(2,fileName); statement.setBlob(3, inputStream); statement.executeUpdate(); } catch (SQLException ex) { ex.printStackTrace(); } finally { if (con != null) { try { con.close(); } catch (SQLException ex) { ex.printStackTrace(); } } } } }
takyafumin

2016/05/05 14:19

> デバッグで確認してみたところ、画像が上手く読み込めておりませんでした。 「上手く読み込めておりませんでした」とはどういった状況になっていましたか? エラーが発生する場合は発生個所やエラーメッセージを記載してみましょう。 これだけでは状況が分からず、アドバイスが難しいです。 ---- > MYSQLのどのあたりが問題なのでしょうか。。。。 問題点の切り分けをしてみましょう。 考えられる原因は以下のいずれかだと思います。 1) 画像が正しくDBに登録できていない 2) DBから画像データを正しく取得できていない 「1」について、Javaプログラムから以外で、正しくDBに登録できていることを確認できますか?例えば、DB操作ツール(Mysqlだとmysql benchやphpMyAdminなど)から確認できますか? 「2」については、「1」が正しいことが前提となります。 まずは「1」について確認してみましょう。 ---- DBの項目としてblob型ですとサイズが64KBとなるようです。 画像サイズに対して足りないようでしたらデータ型の変更も検討してください。 (MIDEUMBLOBやLONGBLOB) 参考URL * https://dev.mysql.com/doc/refman/5.6/ja/string-type-overview.html
junpi-ya

2016/05/06 13:31

ご返信遅くなってしまい、申し訳ございません。 phpMyAdminで確認した所、画像は登録されてました! 原因はイメージタグが、src="getImage?id=${ imgtable.id }">となっており、 サーブレットパス?が記載されていなかったかと思われます。 src="Fileconfirmation?id=${ imgtable.id }">に変更した所、画像が表示されました(^^)/ お忙しいところ色々とアドバイス頂きありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問