0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

サーブレット・JSPでの画像表示

Last updated at Posted at 2021-02-03

#問題
DBにバイナリーファイルとして保存したimageデータを、
jspのsrcよりdoGetにてjspへレスポンスが出来ず画像を出力する事が出来ずに困っております。

DB保存画像 64KBのpng画像
型 BLOB型

#実際のプログラム
##JSP

・・・・・・・・・・
<body>
<h1>データを表示する</h1>

ログインID:	${JavaBean.id}<br>
プロフィール写真:<img src="/プロジェクト名/ImageServlet?id=${JavaBean.id}"  > <br>

</body>
・・・・・・・・・・・

##サーブレット

package servlet;
import........

@WebServlet("/ImageServlet")
public class ImageServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
        String id = request.getParameter("id");
        ImageDAO dao = new ImageDAO();
        BufferedImage bimg = dao.selectImageById(id);

        response.setContentType("image/png");
        OutputStream os =null;
        os=response.getOutputStream();
        ImageIO.write(bimg, "png", os);
        os.flush();
    }
}

##DAO

package dao;

import .........

public class ImageDAO {
	private String url = "jdbc:h2:tcp://localhost/~/DB名";
	private String user = "";
	private String passwd = "";

public BufferedImage selectImageById(String id) {

	   Connection con = null;

		try {
			Class.forName("org.h2.Driver");
			con = DriverManager.getConnection(url, user, passwd);

			//SQL文
			String sql = "SELECT FILE FROM テーブル名 WHERE USER_ID =  ?  ";

			PreparedStatement ps = con.prepareStatement(sql);
			ps.setString(1, "id");
			ResultSet rs = ps.executeQuery();

			//データ取り出し
			if (rs.next()) {
				while (rs.next()) {
					InputStream is = rs.getBinaryStream("FILE");
					BufferedInputStream bis = new BufferedInputStream(is);
					return ImageIO.read(bis);
				}
			}
		} catch (IOException | SQLException | ClassNotFoundException e) {
			e.printStackTrace();
		}
		return null;
	}
}

#エラー内容
Tomcatのエラーログのエラー
スクリーンショット 2021-02-03 23.06.37.png

実行後に表示されるimage表示アイコンの上を右クリックで開くと現れるエラー
スクリーンショット 2021-02-03 23.06.11.png
スクリーンショット 2021-02-03 23.04.55.png

Googleの検証ページのコンソール
スクリーンショット 2021-02-03 23.07.12.png

#考察

エラーログにはServlet.service()が例外をなげました。と記載があり、
Googleの検証ページではデータが大きので変換ができないのようなエラーの記載がありました。

上記のエラーが抽出されServletのレスポンスが帰らない状態です。
画像データ変換容量の問題と解釈をしました。
getBinaryStream("FILE")で受け取り、
BufferedInputStreamにしてコンテンツタイプの指定を行いOutputStreamで返しているはずなのですが、
Servletが例外を出しレスポンスが帰りません。

良い解決法があればご教授をお願いたします。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?