2012-06-25 5 views
10

У меня есть код для отображения диаграммы o сотрудников.Показать BLOB (изображение) через JSP

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

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

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

<% 
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; 
} 

Заранее спасибо!

+0

Стандартное решение заключается в разделении HTML (здесь) из образа, как правило, обслуживаемой другой сервлет отвечая на запрос браузера. Таким образом, страница JSP содержит только что-то вроде '' и у вас есть сервлет, в котором вы отвечаете на двоичный файл изображения. Альтернативное решение (я не рекомендую) было бы отправить изображение как base64 на страницу JSP. –

ответ

16

Вы делаете некоторые фундаментальные ошибки здесь. <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. 

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

+0

В качестве альтернативы OP может переопределить метод 'service()' и не беспокоиться о методах HTTP. : p –

+1

@Elite: Это не ошибка сервлета, если клиент использует семантически неправильный метод для получения изображения идемпотентно. Это всегда ПОЛУЧИТЬ. Все остальное просто неправильно. – BalusC

+0

или используйте 'data:' url http://en.wikipedia.org/wiki/Data_URI_scheme –

2

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

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

+0

Спасибо за внимание! – jMarcel

0
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}" /> 
+0

Следует отметить, что этот подход крайне неэффективен. Используйте это как функцию предварительного просмотра изображений. В прилично разработанном веб-приложении эти временные изображения уже не хранятся в БД на первом месте. Другими словами, этот подход абсолютно не рекомендуется для отображения статических изображений. – BalusC

Смежные вопросы