Отобразить BLOB (изображение) через JSP

У меня есть код для отображения диаграммы o сотрудников.

Данные (имя, телефон, фотография и т.д.) хранятся в SQLServer и отображаются через JSP. Отображение данных в порядке, кроме изображения .jpg(сохранено в столбце IMAGE = BLOB).

Кстати, у меня уже появилось изображение (см. код ниже), но я не знаю, как поместить его в область, определенную в .css(см. также код ниже), так как изображение через полученный результат загружается на всю страницу в браузере.

Кто-нибудь знает, как я могу "создать" изображение?

<%
Connection con = FactoryConnection_SQL_SERVER.getConnection("empCHART");
Statement stSuper = con.createStatement();
Statement stSetor = con.createStatement();

Blob image = null;
byte[] imgData = null;

ResultSet rsSuper = stSuper.executeQuery("SELECT * FROM funChart WHERE dept = 'myDept'");

if (rsSuper.next()) {
image = rsSuper.getBlob(12);
imgData = image.getBytes(1, (int) image.length());
response.setContentType("image/gif");
OutputStream o = response.getOutputStream();
//o.write(imgData); // even here we got the same as below.
//o.flush();
//o.close();

--[...]

<table style="margin: 0px; margin-top: 15px;">
<tr>
<td id="photo">
<img title="<%=rsSuper.getString("empName").trim()%>" src="<%= o.wite(imageData); o.flush(); o.close(); %>" />
</td>
</td>

<td id="empData">
<h3><%=rsSuper.getString("empName")%></h3>
<p><%=rsSuper.getString("Position")%></p>
<p>Id:<br/><%=rsSuper.getString("id")%></p>
<p>Phone:<br/><%=rsSuper.getString("Phone")%></p>
<p>E-Mail:<br/><%=rsSuper.getString("Email")%></p>
</td>
</table>

И вот фрагмент, который должен сфотографировать изображение:

#photo
{
    padding: 0px;
    vertical-align: middle;
    text-align: center;
    width: 170px;
    height: 220px;
}

Спасибо заранее!

Ответ 1

Вы делаете некоторые фундаментальные ошибки здесь. <img src> должен указывать URL-адрес, а не содержать двоичный контент изображения. Тип содержимого самой страницы JSP не должен быть установлен на image/gif. Он должен иметь значение по умолчанию text/html. Неверно, что веб-сервер должен включать конкретные изображения в результат HTML, как вы ожидали. Это веб-браузер, который загружает изображения индивидуально на основе URL-адреса, найденного в атрибуте src, и затем представляет их соответственно.

Проще всего создать отдельный сервлет, который передает изображение из БД в тело ответа. Вы можете однозначно идентифицировать изображение по параметру запроса или информации о пути. Вот пример, который использует для этого параметр запроса:

<img src="imageServlet?id=<%=rsSuper.getString("id")%>" />

Метод doGet() должен в основном выполнять это задание:

String id = request.getParameter("id");

// ...

InputStream input = resultSet.getBinaryStream("imageColumnName");
OutputStream output = response.getOutputStream();
response.setContentType("image/gif");
// Now write input to output the usual way.

Несвязанный к конкретной проблеме, используя сценарии, этот способ официально сильно обескуражен с десятилетия. Возможно, вы читали полностью устаревшие книги/учебники или поддерживаете старое JSP-приложение. Для некоторых соображений см. Также ответы на следующие вопросы для некоторых советов:

Ответ 2

Если вы хотите отобразить изображение через тег HTML, вам нужно будет указать изображение на ресурс на сервере, который загружает изображение, чтобы браузер клиента мог его загрузить. Таким образом, вы можете создать тег <img />.

Для этого большинство людей пишут ImageServlet, который загружает двоичные данные изображения и записывает <img src = "/source/to/someImageServlet?id=<%=rsSuper.getString("id")%>" id = "photo"/>.

Ответ 3

  Connection con = new DBConnection().getConnection();
        String sql = " SELECT * FROM tea ";
        PreparedStatement ps = con.prepareStatement(sql);
        ResultSet rs = ps.executeQuery();

        while (rs.next()) {
            byte[] imgData = rs.getBytes("img"); // blob field 
            request.setAttribute("rvi", "Ravinath");
            rs.getString("teatitle");

            String encode = Base64.getEncoder().encodeToString(imgData);
            request.setAttribute("imgBase", encode);
        }

затем используется jstl для атрибутов извлечения на странице jsp

 <img src="data:image/jpeg;base64,${imgBase}" />