Não consigo renderizar foto

5 respostas
mcruz

Se alguém puder me ajudar, agradeço muito…
A minha aplicação retira uma foto do oracle e tenta escrever no response…
A minha jsp tem o seguinte trecho:

<logic:iterate id="tecnico" name="listaTecnico">
    <tr>
        <td><bean:write name="tecnico" property="nome" scope="page"/></td>
        <td><img src="photo/show?codigo=${tecnico.codigo_te}" /></td>
    </tr>
</logic:iterate>

E o servlet é:

public void doGet(HttpServletRequest request, HttpServletResponse response)	throws ServletException, IOException {
    try {
        int codigo;
        int size;
        byte [] b = new byte[4096];

        codigo = Integer.parseInt(request.getParameter("codigo"));
			
        DBTecnico dbTecnico = DBTecnico.getInstance();

        response.reset();
        response.setContentType("image/jpeg");
        response.addHeader("Content-Disposition", "attachment; filename=\"" + String.valueOf(codigo) + "\"");
			
        OutputStream out = response.getOutputStream();
    // [i]O método a seguir eu já usar usei pra salvar em disco e funciona...[/i]
        InputStream image = dbTecnico.getPhoto(codigo);
			
        while((size=image.read(b)) != -1) {
	response.getOutputStream().write(b, 0, size);
        }

        response.flushBuffer();
        image.close();
    }
    catch(SQLException e) {
        e.printStackTrace(response.getWriter());
    }
}

5 Respostas

J

Tente adicionar isso no fim do servlet:

response.flush();
response.close();

mcruz

Mas a interface HttpServletResponse e sua superinterface não possuem estes métodos…

J

Ops, foi mal, mandei errado…

era pra ser:

response.getOutputStream().flush();
response.getOutputStream().close();

mcruz

Não funcionou…
No código fonte da html a tag img aparece como:

http://localhost:8080/CadFoto/photo/show?codigo=143

Talvez o servlet nem esteja sendo chamado. Não será um erro de mapeamento?
Na JSP a tag img está:

<img src="photo/show?codigo=${tecnico.codigo_te}" />

Aí vai o mapeamento do servlet no web.xml:

<servlet-name>RenderPhoto</servlet-name>
    <servlet-class>MyPackage.RenderPhoto</servlet-class>
  </servlet>
   .
   .
   .
  <servlet-mapping>
    <servlet-name>RenderPhoto</servlet-name>
    <url-pattern>/photo/show</url-pattern>
  </servlet-mapping>
mcruz

Resolvi o problema alterando o tipo retornado pelo método que recupera a foto do banco (agora é um array de bytes):

byte[] in = rs.getBytes("fl_foto");

…e o servlet escreve o array inteiro direto no response:

out.write(imageBytes);

Não sei se é a melhor forma, mas pelo menos funcionou.

Criado 19 de maio de 2006
Ultima resposta 22 de mai. de 2006
Respostas 5
Participantes 2