Falha no Forward após Forçar download de arquivos - STRUTS

Fala galera!!

Seguinte, tenho uma aplicação feita em Struts, em que disponibilizo links para downloads de arquivos txt.

Campos exibidos na página:
Data do processamento
Nome do arquivo(link)
Data do download

Quando o usuário clica no link, precisei chamar uma Action que força a abertura daquela janelinha de download… Se não fizesse isso, o arquivo txt seria aberto no próprio browser…

Nessa action eu seto alguns parâmetros do response:
response.setContentType(“text/plain”);
response.setHeader(“Content-Disposition”,“attachment; filename=”
+ request.getParameter(“nomeArquivo”));

Blz… Ele faz tudo na boa, abre a janelinha, o usuário escolhe o que quer fazer(abrir, salvar ou cancelar)

Só que tem o seguinte, depois que ele faz isso, nessa mesma action eu atualizo a data de download do arquivo…
Ele atualiza na boa, mas no final, não consigo dar o forward para a action que carrega as informações na página(refresh)… Ele simplesmente não faz o foward… Aí, para o cara visualizar a data de download do arquivo atualizada, tem que dar F5…

Seria por causa desses parâmetros do response setados acima que não consigo fazer o forward?

Alguém tem alguma idéia do que possa ser? Ou alguma sugestão?

Desde já, agradeço a atenção de todos…
Abraços!!

Poste a sua Action que faz isso.

Abraço.

Segue…


    public ActionForward execute(ActionMapping mapping, ActionForm form, 
                                 HttpServletRequest request, 
                                 HttpServletResponse response) throws IOException, 
                                                                      ServletException {
          ActionErrors errors = new ActionErrors();
          ActionForward forward = new ActionForward();                                                                      
          
          String nomeArquivo = request.getSession().getAttribute("path") +"\\"+ request.getParameter("nomeArquivo");
          String idArquivo   = request.getParameter("idArquivo");
          
          response.setContentType("text/plain");     
          response.setHeader("Content-Disposition","attachment; filename=" 
                + request.getParameter("nomeArquivo"));   

          // Processa arquivo para download  
          File file = new File(nomeArquivo);
          byte[] content = null;
          int fileLength = (int) file.length();
          FileInputStream fileInput = null;
          
          try {
              fileInput = new FileInputStream(file);
              BufferedInputStream bufferedInput = new BufferedInputStream(fileInput);
              content = new byte[fileLength];
              bufferedInput.read(content, 0, fileLength);
              bufferedInput.close();
                  
          }catch(Exception e){
              
              e.getMessage();
              e.printStackTrace();
              errors.add(ActionErrors.GLOBAL_ERROR, 
                         new ActionError("erro.banco"));
              saveErrors(request, errors);                 
          }                    
          finally {
              if (fileInput != null) {
                          fileInput.close();
              }
          }
          
         ServletOutputStream outStream = response.getOutputStream();
                        
         // envia o conteúdo do arquivo para o stream de resposta
         try {
             outStream.write( content );
             outStream.flush();
         }catch(Exception e){              
             e.getMessage();
             e.printStackTrace();
             errors.add(ActionErrors.GLOBAL_ERROR, 
                       new ActionError("erro.banco"));
             saveErrors(request, errors);                 
         }
         finally {
             outStream.close();              
         }
                
        // Atualiza data de download do arquivo               
        ArquivoBO arquivoBO = new ArquivoBO();
        try{
            arquivoBO.atualizaData(idArquivo);

        }catch(SQLException e){
            e.getMessage();
            e.printStackTrace();
            errors.add(ActionErrors.GLOBAL_ERROR, 
                       new ActionError("erro.banco"));
            saveErrors(request, errors);                   
        }
       
        catch(Exception e){       
            e.getMessage();
            e.printStackTrace();
            errors.add(ActionErrors.GLOBAL_ERROR, 
                       new ActionError("erro.banco"));
            saveErrors(request, errors);             
        }
            
       
        if (!errors.isEmpty()) {
            saveErrors(request, errors);              
            forward = mapping.findForward("erro");
        } else {              
            forward = mapping.findForward("sucesso");
        }
        
        return (forward);
    }

Você possui os mapeamentos para “erro” e “sucesso” para esta Action no seu struts-config.xml ?

Sim. Estão mapeados corretamente…

Tanto que se eu comento o trecho referente ao processo de download do arquivo e deixo só a parte que atualiza a base(ArquivoBO), ao clicar no link, ele faz o forward certinho e me mostra a data do download atualizada…

O problema está em conseguir fazer esse forward depois de aparecer a janelinha de download…

Abraço!

Sinceramento não sei o que pode estar ocorrendo.
Uma sugestão : Crie uma Servlet que faça esse seu processo de download, e no seu Action do Struts, somente chame um método nesta Servlet.

Abraço.

Tentei fazer conforme sugeriu, mas também não obtive sucesso…
Caí no mesmo problema… O objeto response fica “preso” à exibição da janelinha de download…

Mas de qualquer forma, muito obrigado pela sua ajuda, Luis…

Um abraço!!