서블릿 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;
}
}
오류 내용
Tomcat 오류 로그 오류
실행 후 표시되는 이미지 표시 아이콘을 마우스 오른쪽 버튼으로 클릭하면 나타나는 오류
Google 검증 페이지 콘솔
고찰
에러 로그에는 Servlet.service()가 예외를 올렸습니다. 라고 기재가 있어,
Google의 검증 페이지에서는 데이터가 크기 때문에 변환이 불가능한 것과 같은 오류의 기재가 있었습니다.
상기의 에러가 추출되어 Servlet의 응답이 돌아오지 않는 상태입니다.
이미지 데이터 변환 용량의 문제와 해석을 했습니다.
getBinaryStream("FILE")로 받고,
BufferedInputStream로 하고 컨텐츠 타입의 지정을 실시해 OutputStream로 돌려주고 있을 것입니다만,
Servlet이 예외를 발생시키고 응답이 반환되지 않습니다.
좋은 해결책이 있으면 교수를 부탁드립니다.
Reference
이 문제에 관하여(서블릿 JSP에서 이미지 표시), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/kiamoto_keiko/items/eb3530574c90f79fe667
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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 오류 로그 오류
실행 후 표시되는 이미지 표시 아이콘을 마우스 오른쪽 버튼으로 클릭하면 나타나는 오류
Google 검증 페이지 콘솔
고찰
에러 로그에는 Servlet.service()가 예외를 올렸습니다. 라고 기재가 있어,
Google의 검증 페이지에서는 데이터가 크기 때문에 변환이 불가능한 것과 같은 오류의 기재가 있었습니다.
상기의 에러가 추출되어 Servlet의 응답이 돌아오지 않는 상태입니다.
이미지 데이터 변환 용량의 문제와 해석을 했습니다.
getBinaryStream("FILE")로 받고,
BufferedInputStream로 하고 컨텐츠 타입의 지정을 실시해 OutputStream로 돌려주고 있을 것입니다만,
Servlet이 예외를 발생시키고 응답이 반환되지 않습니다.
좋은 해결책이 있으면 교수를 부탁드립니다.
Reference
이 문제에 관하여(서블릿 JSP에서 이미지 표시), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/kiamoto_keiko/items/eb3530574c90f79fe667
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
에러 로그에는 Servlet.service()가 예외를 올렸습니다. 라고 기재가 있어,
Google의 검증 페이지에서는 데이터가 크기 때문에 변환이 불가능한 것과 같은 오류의 기재가 있었습니다.
상기의 에러가 추출되어 Servlet의 응답이 돌아오지 않는 상태입니다.
이미지 데이터 변환 용량의 문제와 해석을 했습니다.
getBinaryStream("FILE")로 받고,
BufferedInputStream로 하고 컨텐츠 타입의 지정을 실시해 OutputStream로 돌려주고 있을 것입니다만,
Servlet이 예외를 발생시키고 응답이 반환되지 않습니다.
좋은 해결책이 있으면 교수를 부탁드립니다.
Reference
이 문제에 관하여(서블릿 JSP에서 이미지 표시), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kiamoto_keiko/items/eb3530574c90f79fe667텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)