サーブレット・JSPでの画像表示
問題
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;
}
}
エラー内容
・・・・・・・・・・
<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();
}
}
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が例外を出しレスポンスが帰りません。
良い解決法があればご教授をお願いたします。
Author And Source
この問題について(サーブレット・JSPでの画像表示), 我々は、より多くの情報をここで見つけました https://qiita.com/kiamoto_keiko/items/eb3530574c90f79fe667著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .