У меня есть jsp, в котором для каждой строки таблицы мне нужно отобразить изображение, присутствующее в базе данных. Я извлекаю все данные строки таблицы из базы данных, включая изображение в виде BLOB-объекта, и сохраняю его в bean-компоненте. Изображение хранится в bean-компоненте в виде массива байтов следующим образом:
photo = rs.getBlob("PHOTO");
photoByteArray = photo.getBytes(1, (int)photo.length());
При циклическом просмотре списка bean-компонентов в jsp атрибут src указывает на такой сервлет:
<img class="img" width="55" height="50" src="displayThumbnail?photoData=${part.photoData}">
который служит изображению, как показано ниже, но они не отображаются, однако при отладке массив байтов, похоже, имеет данные.
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("image/jpeg");
OutputStream o = response.getOutputStream();
String photoDataStr = request.getParameter("photoData");
byte[] photoData = null;
if(photoDataStr != null) {
photoData = photoDataStr.getBytes();
}
o.write(photoData);
o.close();
}
Однако изображение не появляется. Теперь, если я запрашиваю базу данных для каждого отдельного изображения, как показано ниже, в этом случае изображения отображаются нормально.
protected void processRequest(HttpServletRequest request, HttpServletResponse response) {
PreparedStatement pstmt = null;
ResultSet rs = null;
Connection conn = null;
try {
if(conn == null) {
conn = open();
}
pstmt = conn.prepareStatement("select photo from PART_PHOTOS where id = ?");
String id = request.getParameter("id");
pstmt.setString(1, id);
rs = pstmt.executeQuery();
if (rs.next()) {
Blob b = rs.getBlob("photo");
response.setContentType("image/jpeg");
response.setContentLength((int) b.length());
InputStream is = b.getBinaryStream();
OutputStream os = response.getOutputStream();
byte buf[] = new byte[(int) b.length()];
is.read(buf);
os.write(buf);
os.close();
is.close();
}
} catch (Exception ex) {
System.out.println(ex.getMessage());
ex.printStackTrace();
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
if (pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
pstmt = null;
}
//check if it's the end of the loop
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
}
Я был бы очень признателен, если бы кто-нибудь мог дать какие-либо рекомендации по поводу того же самого.