#問題
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;
}
}
実行後に表示されるimage表示アイコンの上を右クリックで開くと現れるエラー
#考察
エラーログにはServlet.service()が例外をなげました。と記載があり、
Googleの検証ページではデータが大きので変換ができないのようなエラーの記載がありました。
上記のエラーが抽出されServletのレスポンスが帰らない状態です。
画像データ変換容量の問題と解釈をしました。
getBinaryStream("FILE")で受け取り、
BufferedInputStreamにしてコンテンツタイプの指定を行いOutputStreamで返しているはずなのですが、
Servletが例外を出しレスポンスが帰りません。
良い解決法があればご教授をお願いたします。