pessoal, estou tendo este estranho problema em uma área da minha aplicação que exibe imagens gravadas no banco de dados
carrego a imagem em uma modal, mas depois de uns 10 segundos a imagem desaparece, ficando apenas aquele ícone de imagem não encontrada
este problema está ocorrendo apenas no Chrome
carrego a imagem a partir de uma servlet. Segue o trecho em q defino o http-header
resp.setHeader("Content-Type", getServletContext().getMimeType(imageName));
resp.setHeader("Content-Length", String.valueOf(loginMB.getTamanhoImg()));
resp.setHeader("Content-Disposition", "inline; filename=\""+imageName+"\"");
resp.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
resp.setHeader("Pragma", "no-cache");
depois q a imagem desaparece, a mensagem q aparece no console do chrome é a seguinte:
GET http://localhost/app/imagem_pdf/arquivopdf?id=426&pagina=1&tipoview=1 jquery.js.ged:23
Rafael como você fez para resolver este problema?
O problema está localizado na seguinte linha do codigo:
resp.setHeader(“Content-Length”, String.valueOf(loginMB.getTamanhoImg()));[color=red] [/color]
Caso o tamanho do arquivo a ser adicionado no outputstream não esteja correto, por algum motivo o google chrome fica esperando recurso da servlet. Como este recurso não existe, o chrome entendi que a imagem não foi totalmente carregada e faz a mesma deixar de ser apresentada.
Quando utilizado IE ou Firefox, o problema de desaparecimento da imagem não ocorre, mas a aplicação fica lenta e o símbolo de carregando que o navegador exibe sobre a janela aberta fica em loading até atingir o time out de conexão.
O correto é configurar na chamada resp.setHeader(“Content-Length”, TAMANHO_DA_IMAGEM); o tamanha de bytes correto da imagem, esse valor em bytes pode ser obtido utilizando uma classe qualquer que estenda java.io.OutputStream.
A baixo é apresentado o código da servlet que desenvolvi. O mesmo está funcionando corretamente. Segue o exemplo:
package br.com.ccpstd.pcweb.servlet;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import br.com.ccpstd.pcu.util.properties.PropertiesUtil;
/**
* Classe que implementa a servlet utilizada para apresentar as paginas do
* arquivo PDF no formado de imagem PNG.
*
* @author Bruno Maioli Martins
* @since 30/05/2013
* @version 1.0
*/
public class ImageViewerServlet extends HttpServlet {
/**
* Atributo de serializacao do objeto.
*/
private static final long serialVersionUID = 6139983547773532230L;
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
File file = getFileImage(request);
if (!file.exists()) {
response.sendRedirect(request.getContextPath() + "/faces/pages/error/accessdenied.xhtml");
return;
}
/**
* Le a imagem para o array de bytes Output Stream.
*/
ByteArrayOutputStream baos = readImage(file);
/**
* Configura o header da resposta.
*/
configHeader(file, baos, response);
/**
* Escreve a imagen no response.
*/
writeImage(baos, response);
/**
* Remove o arquivo temporario.
*/
file.delete();
}
/**
* Configura o reader da resposta para enviar a imagem.
*
* @param file
* Arquivo de imagem.
* @param baos Byte array da imagem.
* @param response
* Objeto de resposta.
*/
private void configHeader(File file, ByteArrayOutputStream baos, HttpServletResponse response) {
response.setContentType(getServletContext().getMimeType(file.getName()));
response.setContentLength(baos.size());
response.setHeader("Content-Disposition", "inline; filename=\"" + file.getName() + "\"");
}
/**
* Le a imagem e adiciona no objeto {@link ByteArrayOutputStream}.
*
* @param file
* Arquivo de imagem.
* @return Imagem lida para o objeto {@link ByteArrayOutputStream}.
* @throws IOException
* Erro ao ler o arquivo de imagem.
*/
private ByteArrayOutputStream readImage(File file) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
BufferedImage read = ImageIO.read(file);
String name = file.getName();
int indexOf = name.lastIndexOf(".");
ImageIO.write(read, name.substring(indexOf + 1), baos);
baos.flush();
return baos;
}
/**
* Escreve a imagem no objeto resposta.
*
* @param baos
* Objeto com a imagem.
* @param response
* Objeto de resposta.
* @throws IOException
* Erro ao escrever a imagem no response.
*/
private void writeImage(ByteArrayOutputStream baos, HttpServletResponse response) throws IOException {
BufferedInputStream input = null;
BufferedOutputStream output = null;
InputStream is = new ByteArrayInputStream(baos.toByteArray());
try {
input = new BufferedInputStream(is);
output = new BufferedOutputStream(response.getOutputStream());
byte[] buffer = new byte[is.available()];
int length;
while ((length = input.read(buffer)) > 0) {
output.write(buffer, 0, length);
}
} finally {
if (output != null) {
output.close();
}
if (input != null) {
input.close();
}
}
}
/**
* Retorna o arquivo de imagem alocado no diretorio temporario para ser
* apresentado na pagina.
*
* @param request
* Objeto de requisicao.
* @return Arquivo de imagem.
*/
private File getFileImage(HttpServletRequest request) {
String fileName = request.getParameter("imageFileName");
String dir = PropertiesUtil.getValue("tmp.dir");
if (!dir.endsWith("/") && !dir.endsWith("\\")) {
dir += File.separator;
}
return new File(dir + fileName);
}
}