How to retrieve and display images from a database in a JSP page?
Как извлекать и отображать изображения из базы данных на странице JSP?
Как я могу извлекать и отображать изображения из базы данных на странице JSP?
Переведено автоматически
Ответ 1
Давайте пошагово посмотрим, что должно произойти:
JSP - это в основном технология просмотра, которая должна генерировать выходные данные HTML.
Для отображения изображения в формате HTML вам нужен элемент HTML <img>.
Чтобы он мог найти изображение, вам нужно указать его src атрибут.
src Атрибут должен указывать на действительный http:// URL-адрес, а следовательно, не на путь к файловой системе локального диска, file:// поскольку это никогда не сработает, когда сервер и клиент работают на физически разных машинах.
URL-адрес изображения должен содержать идентификатор изображения либо в пути запроса (например, http://example.com/context/images/foo.png), либо в качестве параметра запроса (например, http://example.com/context/images?id=1).
В мире JSP / Servlet вы можете позволить сервлету прослушивать определенный шаблон URL, например /images/*, чтобы вы могли просто выполнить некоторый Java-код на определенных URL.
В сервлете вы можете просто записать это byte[] или InputStream в OutputStream ответ обычным способом ввода-вывода на Java.
Клиентская сторона должна быть проинструктирована о том, что данные должны обрабатываться как изображение, поэтому, по крайней мере, Content-Type заголовок ответа также должен быть установлен. Вы можете получить нужное через ServletContext#getMimeType() на основе расширения файла изображения, которое вы можете расширить и / или переопределить через <mime-mapping> in web.xml.
Так и должно быть. Он практически сам пишет код. Давайте начнем с HTML (на JSP):
Затем определите / создайте сервлет, который прослушивает запросы GET по шаблону URL /images/*, в приведенном ниже примере для задания используется простой ванильный JDBC:
// content=blob, name=varchar(255) UNIQUE. privatestaticfinalStringSQL_FIND="SELECT content FROM Image WHERE name = ?";
@Resource(name="jdbc/yourDB")// For Tomcat, define as <Resource> in context.xml and declare as <resource-ref> in web.xml. private DataSource dataSource;
response.setContentType("image/jpeg"); ServletOutputStream out; out = response.getOutputStream(); Connectionconn= employee.DbConnection.getDatabaseConnection(); HttpSessionsession= (HttpSession) request.getSession(); StringID= session.getAttribute("userId").toString().toLowerCase(); try { stmt = conn.createStatement(); sql = "select user_image from employee_data WHERE username='" + ID + "' and rownum<=1"; ResultSetresult= stmt.executeQuery(sql); if (result.next()) { in = result.getBinaryStream(1);// Since my data was in first column of table. } bin = newBufferedInputStream(in); bout = newBufferedOutputStream(out); intch=0; while ((ch = bin.read()) != -1) { bout.write(ch); }
} catch (SQLException ex) { Logger.getLogger(displayfetchimage.class.getName()).log(Level.SEVERE, null, ex); } finally { try { if (bin != null) bin.close(); if (in != null) in.close(); if (bout != null) bout.close(); if (out != null) out.close(); if (conn != null) conn.close(); } catch (IOException | SQLException ex) { System.out.println("Error : " + ex.getMessage()); } }
response.setContentType("image/jpeg"); ServletOutputStream out; out = response.getOutputStream(); Connectionconn= employee.DbConnection.getDatabaseConnection(); HttpSessionsession= (HttpSession) request.getSession(); StringID= session.getAttribute("userId").toString().toLowerCase(); try { stmt = conn.createStatement(); sql = "select user_image from employee_data WHERE username='" + ID + "' and rownum<=1"; ResultSetresult= stmt.executeQuery(sql); if (result.next()) { in = result.getBinaryStream(1); } bin = newBufferedInputStream(in); bout = newBufferedOutputStream(out); intch=0; while ((ch = bin.read()) != -1) { bout.write(ch); }
} catch (SQLException ex) { Logger.getLogger(displayfetchimage.class.getName()).log(Level.SEVERE, null, ex); } finally { try { if (bin != null) bin.close(); if (in != null) in.close(); if (bout != null) bout.close(); if (out != null) out.close(); if (conn != null) conn.close(); } catch (IOException | SQLException ex) { System.out.println("Error : " + ex.getMessage()); } }
}
}
Ответ 4
Попробуйте очистить и закрыть выходной поток, если он не отображается. Blob image = rs.getBlob(ImageColName); InputStream in = image.getBinaryStream(); // Выведите большой двоичный объект в HttpServletResponse response.setContentType("image/jpeg"); BufferedOutputStream o = new BufferedOutputStream(response.getOutputStream());