Download de arquivo excel

Amigos,

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

Qual o problema com o codigo acima?

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 :slight_smile:

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().

Utilize ServletOutputStream para enviar bytes pro navegador… :!:

Beleza galera, funcionou, valeu mermo.

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 q é só tirar o content-type

Ja tirei o content-type e nao funcionou…

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…

Hummm

Acho que deve ter algo pra fazer isso, se nao for algo no header talvez seja via javascript.

Prefiro automatizar isso mas se nao der certo vou fazer desse jeito mesmo, coloco um texto explicativo informando ao usuario como salvar o arquivo.

Galera,

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.

Obrigado a todos.