Ir para o conteúdo

 Voltar a Banco de Tal...
Tela cheia

Enviar arquivo xls para o browser.

7 de Maio de 2010, 17:14 , por Desconhecido - | Ninguém seguindo este artigo por enquanto.
Visualizado 6 vezes

Olá pessoal, primeiramente gostaria de desejar sucesso para o projeto.

Ao tentar enviar um fluxo de stream para o browser através do "response.getOutputStream().write(conteudo)" a instrução na minha action é realizada normalmente. Porém, ao retornar e sair da action, em uma das classes que não são do processamento customizado da aplicação me deparo com o seguinte erro:

"java.lang.IllegalStateException: getOutputStream() has already been called for this response", dizendo que não foi possível chamar o método novamente.

 Minha dúvida é a seguinte: tentei enviar um arquivo para o browser a partir da minha action (de maneira convencional), mas, há alguma forma já implementada no código básico da aplicação para se realizar essa tarefa? Alguma classe wrapper que possa ser utilizada para pegar o OutputStream em qualquer action e enviar dados para o cliente?

Obrigado pela atenção!

 Kallás.


Autor: Kallás Kallás


33 comentários

  • F24dd96a3b3343b99b684fc44d2e5b71?only path=false&size=50&d=404Luciano Dias(usuário não autenticado)
    10 de Maio de 2010, 10:36

     

    Oi Kallás,

    Acho que você pode se basear no código do método CurriculoSequencia.curriculoGerarRelatorio() que gera um arquivo PDF e o envia para o "browser".

    Lembre-se de não especificar nenhum <forward .../> dentro da <action .../> em questão no arquivo de configuração do struts, caso contrário você receberá o erro que você citou (veja a configuração da ação /curriculoGerarRelatorio no arquivo BancoTalentosGestao-struts.xml).

    Um abraço,

    Luciano.

    • 6ec01e2c2c1c822a058ee6b3483baa3c?only path=false&size=50&d=404Kallás Kallás(usuário não autenticado)
      26 de Maio de 2010, 8:38

       

      Olá Luciano!

      Primeiramente, gostaria de agradecer pela atenção e a ajuda disponibilizada.

      Quanto ao problema citado, fazendo uma pesquisa (internet e amigos), vi que quando se utiliza "response.getOutputStream() - ou getWriter()" somente pode-se "pegar" o stream de escrita uma única vez. Vi também que, depois de usado um dos dois métodos citados, há uma maneira de indicar ao final das instruções do método que o stream já foi fechado (ou seja, todos os dados desejados já foram escritos no stream de resposta)...

      Ainda não sei como fazer isso, pois, parei a pesquisa porque resolvi de outra maneira. Mas, quando encontrar o código para sinalizar o encerramento do "response", volto a postar aqui.

      A solução que utilizei para contornar o problema foi criar uma pasta de trabalho "temp", na raiz da aplicação. Então, quando precisei enviar o stream para o usuário, criei um arquivo (.XLS no meu caso) nessa pasta "temp" e disponibilizei o link do arquivo para download.

       

      De qualquer maneira, resolveu o meu problema. No mais, como dito, obrigado pela atenção!

       Kallás.

      • F24dd96a3b3343b99b684fc44d2e5b71?only path=false&size=50&d=404Luciano Dias(usuário não autenticado)
        26 de Maio de 2010, 10:26

         

        Oi Kallás,

        Dê uma olhada no código da classe org.displaytag.filter.ResponseOverrideFilter.  Essa classe é um filtro (configurado no web.xml) do componente displaytag. Esse filtro identifica se o usuário pediu uma "exportação" de dados (para xml, pdf, ...) e altera o response de acordo com o desejado.

         Talvez essa classe lhe ajude a encontrar uma outra solução para seu problema.

        Um abraço,

        Luciano.

Essa comunidade não possui posts nesse blog