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!!