tenho um servlet que devera disponibilizar um arquivo do excel pra download na minha pagina. Os arquivos ficam armazenados na pasta WEB_INF da minha aplicacao.
Estou criando um FileOutputStream e carregando o arquivo corretamente mas quando mando escrever a saida do arquivo o browser exibe apenas java.io.FileOutputStream@1982fc1, ou seja, ele conseguiu instanciar o stream do arquivo.
Ja configurei o content-type pra “application/vnd.ms-excel” mas nao funcionou, nesse caso ele abre o excel mas nao abre o arquivo correto.
O codigo eh mais ou menos o seguinte:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("application/vnd.ms-excel");
PrintWriter out = response.getWriter();
try {
int id = Integer.parseInt(request.getParameter("id"));
Fachada fachada = Fachada.getInstance();
Venda v = fachada.buscarVenda(id);
if (v != null) {
OutputStream os = fachada.buscarArquivoVenda(v);
out.println(os.toString());
}
else {
out.println("Venda inexistente");
}
}
catch(NumberFormatException e) {
out.println(e.getMessage());
}
}
O problema aqui eh fazer o out.println(os.toString()) - voce esta mandando imprimir uma representacao em String do objeto os, mas essa representacao nao eh o conteudo do arquivo, e sim java.io.FileOutputStream@1982fc1
O mais correto seria fazer com que a sua fachada retornasse um InputStream (ao inves de OutputStream), e, para cada byte nele, escrevesse na saida do Servlet.
Ah, e cuidado com o PrintWriter do Servlet - voce pode ter problemas serios ao enviar dados binarios por ele. Prefira o OutputStream retornado por HttpServletResponse.getOutputStream().
So mais uma duvida: quero forcar que seja efetuado um download, ou seja, se o cliente tiver um excel instalado o arquivo nao sera exibido no browser dele, como seria isso? Talvez colocando alguma coisa no header?
Acho que o unico jeito eh instruir o usuario a clicar em ‘save link as’… isso eh um comportamento que vai depender MUITO da maquina do usuario - se ele nao tiver o excel instalado, por exemplo, o IE vai oferecer um download…
so pra constar ai no forum, pode ser que algum dia alguem tenha a mesma duvida. Consegui resolver, foi so colocar o content-type como “APPLICATION/OCTET-STREAM”.
Ficou muito legal, aproveitei e fiz uma TagLib pra gerenciar isso.