Chrome: imagem carrega e depois desaparece

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