[Resolvido] Forçar download em servidor HTTPS (InputStreamDownload) (VRaptor)

12 respostas
R

Boa tarde pessoal,

Estou com um problema bem específico, não sei se algum de vocês já passou por isso:

Tenho um projeto em Java, no qual o cliente pode fazer o download de arquivos que são gerados dinamicamente, essa classe retorna um InputStreamDownload.

Está funcionando perfeitamente, porém quando coloco em um servidor HTTPS, ele para de funcionar no IE8.

Aparece uma mensagem dizendo o IE não pode abrir o site.

O que eu reparei é que quando é HTTP, ele pega o nome do arquivo corretamente, mas com HTTPS, ele pega o nome do método que gera o arquivo (digo método porque estou usando o VRaptor).

Alguém saberia me ajudar nisso?

Muito obrigado,

12 Respostas

Lucas_Cavalcanti

vc tá passando o nome do arquivo no Download?
tá passando true no parâmetro doDownload?

R

Lucas Cavalcanti:
vc tá passando o nome do arquivo no Download?
tá passando true no parâmetro doDownload?

Sim e sim. Ele funcioa perfeitamente em http, mas em https e no IE 8 ele deixa de funcionar.

Tem alguma idéia do que pode ser Lucas? Não to nem sabendo como buscar isso nas pesquisas por ser tão específico.

Abraços!

Lucas_Cavalcanti

vc tá passando o tamanho do download? É bem estranho isso acontecer assim, nunca tinha ouvido falar…

Lucas_Cavalcanti

todo caso, dá pra fazer uma gambi.

faça a url do controller terminar com o nome do arquivo:

@Get("/..../{fileName}")
public Download seuMetodo(String fileName) {
    //pode até ignorar esse nome...
}

daí o browser não tem do que reclamar :wink:

R

Exatamente Lucas, essa foi a primeira “solução” que me veio a cabeça rs!

Estou sem ambiente SSL de testes, o pessoal de infra está providenciando, após o teste eu coloco o resultado aqui pra compartilhar com o pessoal que possa vir a ter esse problema.

Abraços!

R

É Lucas, não rolou.

O IE troca o ponto por underline, ou seja, a URL “/download/123/arquivo.txt” se torna “/download/123/arquivo_txt”, e conseguentemente o erro permanece.

Vou pensar em mais alternativas. Toda ajuda é bem vinda!

Abraços!

R

Prosseguindo com o post, eu consegui solucionar, porém não pude usar o VRaptor, fiz um Servlet.

No VRaptor, eu fazia:

public InputStreamDownload arquivoBaixarEntrada(int nProc, int idArquivo) {
  try {
    ArquivoProntoBancoBean arquivo = XxxDAO.arquivo();
    return new InputStreamDownload(arquivo.getStream(), "text/plain", arquivo.getNome() + "." + arquivo.getExtensao().toLowerCase(), true, arquivo.getTamanho());
  } catch (Exception e) {
  }
}

No Servlet, fiz:

public static void download(String nProc, String idArquivo, UsuarioLogadoBean usuarioLogado, HttpServletResponse response) throws IOException {
  ArquivoProntoBancoBean arquivo;
  ServletOutputStream outStream = response.getOutputStream();
  try {
    arquivo = XxxDAO.arquivo();
    response.addHeader("Content-Disposition", "attachment; filename=" + arquivo.getNome() + "." + arquivo.getExtensao().toLowerCase());
    response.setContentType("application/download");
    byte[] bytes = IOUtils.toByteArray(arquivo.getStream());
    outStream.write(bytes);
    outStream.flush();
  } catch (Exception e) {
    e.printStackTrace();
  } finally {
    outStream.close();
  }
}

Vou continuar pesquisando uma solução para isso usando o VRaptor, pois não gostaria de ter que “sair” dele para poder solucionar o problema.

Sugestões, discuções, são bem vindas!

Abraços.

Lucas_Cavalcanti

tenta trocar no do vraptor o “text/plain” pra “application/download”

R

Já fiz esse teste e não rolou.

Me da a impressão que o servidor https coloca mais informações no header, mas é uma quantidade grande que acaba “removendo” os headers que o vraptor põe (naquele meu teste eu coloco um único header).

Um amigo está com exatamente o mesmo problema em .NET, e uma pessoa com quem ele tava conversando falou que acreditava ser relacionado a header, que fica maior com https mesmo.

Qualquer novidade eu posto aqui.

Abraços.

Lucas_Cavalcanti

receba o HttpServletResponse no construtor do controller e faça o mesmo código que vc fez na servlet… em todo caso é bizarro, pq o VRaptor faz um código mto parecido com o que vc fez:

só não tem o flush()

R

Lucas Cavalcanti:
receba o HttpServletResponse no construtor do controller e faça o mesmo código que vc fez na servlet… em todo caso é bizarro, pq o VRaptor faz um código mto parecido com o que vc fez:

só não tem o flush()

Então, eu tinha olhado o código do VRaptor também e notei que era muuuito parecido, ai fiz o seguinte:

No meu método que “força o download”, coloquei um “response.reset()”, e funcionou.

Eu tenho um Interceptor que coloca algumas coisas no Header, então fazendo isso eu “limpo” o header completamente antes de forçar o download.

Um dos meus headers é sobre “pragma: no cache”, e me falaram que removendo ele funcionaria. E funcionou.

Embora ainda tenho dúvida da real origem: “pragma no cache” ou “excesso de headers”.

Hoje não tive tempo de testar isso, mas amanhã vou testar para ver qual é o problema exatamente.

Eu posto aqui o resultado para ficar com a solução bem definida.

Abraços velhão!

R

Bom fiz os testes, e resumindo, o que faz com que o IE8 não deixe forçar download é o header “Pragma: no-cache” (setHeader(“Pragma”, “no-cache”)).

Um vez removido, funciona normalmente.

Muito obrigado!

Abraços!

Criado 14 de fevereiro de 2012
Ultima resposta 17 de fev. de 2012
Respostas 12
Participantes 2