Pessoal, estou com o seguinte problema, tenho que disponibilizar para o usuário fazer o download de um relatório com o VRaptor. Eu já fiz isso somente com servlet. Ficou assim:
String dados = FormatLayout.getList(empresa, codigo);
String nome = codigo + ".txt";
String caminho = (getServletContext().getRealPath("\\downloads\\") + nome);
FileOutputStream fileOut = new FileOutputStream(caminho);
fileOut.write(dados.getBytes());
response.setContentType("inline/download");
String arq = "attachment;filename=" + nome;
response.setHeader("Content-Disposition", arq);
ServletOutputStream os = response.getOutputStream();
os.write(dados.getBytes());
fileOut.flush();
os.flush();
os.close();
Eu tenho que fazer o mesmo, mas com o VRaptor. Eu li o tutorial do site: http://www.vraptor.org/pt/file-download.html mas não entendi direito. Alguém sabe como fazer?
Desde já, muito obrigado! :mrgreen:
Tentei fazer assim:
@Viewless
public void geraRelatorio() throws IOException {
String dados = gerarDados();
clientOutput.setContentType("inline/download");
ServletOutputStream os = clientOutput.getOutputStream();
os.write(dados.getBytes());
os.flush();
os.close();
}
Mas acho que está incompleto. Alguém tem alguma idéia? Valew!
O que acontece? Qual é o erro?
A idéia daquele tutorial é que se você injetar o HttpServletResponse pelo construtor, pode escrever sua lógica igualzinha àquela sua Servlet.
Oi Sérgio, obrigado pela sugestão, eu já tinha feito dessa forma mesmo, mas imaginei que o VRaptor tivesse uma forma diferente de fazer isso, sem utilizar o response. Vou colocar a solução:
@Viewless
public void geraRelatorio() throws IOException {
String dados = gerarDados();
String nome = codPedidoRel + ".txt";
FileOutputStream fileOut = new FileOutputStream(nome);
fileOut.write(dados.getBytes());
fileOut.flush();
fileOut.close();
response.setContentType("inline/download");
String arq = "attachment;filename=" + nome;
response.setHeader("Content-Disposition", arq);
ServletOutputStream os = response.getOutputStream();
os.write(dados.getBytes());
os.flush();
os.close();
}
Obrigado pela ajuda! :mrgreen:
@von.Juliano
Vc poderia jogar todo o seu codigo numa lógica de vraptor. So precisa injetar o HttpServletResponse usando constructor injection ou @In (também precisa @Viewless acima do metodo).
http://www.vraptor.org/injection.html
Mas a ideia do tuturial e do vraptor em geral eh que vc nao mexe nas lógicas com a api Servlet seja Response ou Request ou Session ou …
Por isso o tutorial usa um wrapper ClientOutput que embrulha o HttpServletResponse. O Interceptor serve para criar esse wrapper. Na sua lógica vc usa o wrapper e fica livre da api servlet.
[]'s,
Nico
Oi Nico, cara eu acabei entendendo o exemplo do tutorial, e tentei implemetar da mesma forma que ele apresenta, só que não funcionou! Quando eu tentava usar algum método de ClientOutput, dava NullPointerException! A minha classe ClientOutput e a DownloadInterceptor estava IDÊNTICAS as do site. Acho que o interceptor é que não funcionava…
Mas tudo bem, mesmo que o problemas não tenha sido resolvido da forma mais “nobre” :XD: . Valew!!!
Veja a linha do NullPointerException… assim voce descobre o que era null… e ai consegue encontrar qual linha nao foi executada que inicializava a sua variavel.
abraço
Oi Guilherme, obrigado por responder o tópico!
Olha só, a NullPointerException ocorre por que o ClientOutput está nulo, e se é no interceptor que ele é inicializado então acho o problema é que o interceptor não funciona! Sabe por que isso acontece?
Muito obrigado! :mrgreen: