IE não aceita no-cache para download de arquivos

3 respostas
victorwss

Oi pessoal. Estava com um problema que o IEca 6 não aceita o valor "no-cache" no header "Cache-Control" para downloads. Vi aqui e aqui que isso faz com que o IE descarte o arquivo antes de visualizá-lo.

Comentando a linha que coloca esse header resolve o problema parcialmente. O IE consegue baixar o arquivo, mas ele começa a fazer cache deste, e na aplicação que estou criando é inaceitável que faça cache.

No firefox não há nenhum problema.
E então, alguém tem uma idéia do que fazer para o IE aceitar o arquivo sem fazer cache?

package br.com.meuteste.teste;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class FileServlet2 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException {
        response.setContentLength(750054);
        response.setContentType("application/bmp");

        // PROBLEMA AQUI!!!!!
        response.setHeader("Cache-Control", "no-cache");

        response.setHeader("Content-Disposition",
                "attachment; filename=\"figurinha.bmp\"");

        OutputStream s = response.getOutputStream();

        // Manda a figura para o browser.
        ImageIO.write(criarFiguraAleatoria(), "bmp", s);
        s.flush();
    }

    private static final Color[] cores = new Color[] {
        Color.BLUE, Color.RED, Color.WHITE, Color.YELLOW,
        Color.BLACK, Color.CYAN, Color.GRAY, Color.DARK_GRAY,
        Color.MAGENTA, Color.LIGHT_GRAY
    };

    private BufferedImage criarFiguraAleatoria() {
        BufferedImage i =
            new BufferedImage(500, 500, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = (Graphics2D) i.getGraphics();
        g.setColor(cores[new Random().nextInt(10)]);
        g.fillRect(0, 0, 500, 500);
        Ellipse2D e = new Ellipse2D.Double(100, 100, 300, 300);
        g.setColor(Color.GREEN);
        g.fill(e);
        g.setColor(Color.BLACK);
        g.drawString(String.valueOf(new Random().nextInt(10000)), 240, 248);
        return i;
    }
}

3 Respostas

qmx

coloca um random na frente do arquivo

tipo filename=\figurinha129863.bmp

esse random vc consegue com new java.util.Random().nextInt(10000);

meus .02

victorwss

Tentei isso do random na figurinha e não deu certo. :shock:
Eu coloquei new Date().getTime() + “_” + new Random().nextLong() no nome e mesmo assim o IE fez cache.

victorwss

if (!request.getHeader("user-agent").contains("MSIE")) { response.setHeader("Cache-Control", "no-cache"); response.setHeader("Content-Disposition", "attachment; filename=\"figurinha.bmp\""); } else { response.setHeader("Content-Disposition", "attachment;"); }Essa gambiarra resolveu o problema neste exemplo que postei. Mas na aplicação real ele não funciona, dá java.net.SocketException: Connection reset by peer, socket write error.

Criado 27 de novembro de 2008
Ultima resposta 27 de nov. de 2008
Respostas 3
Participantes 2