Downloads com VRaptor

Boa noite.

Quero disponibilizar o arquivo ‘WEB-INF/resources/relatorios.tar.gz’ para download, para isso usei o segundo exemplo de download dado na documentação do VRaptor, mas o caminho para o arquivo fica errado, como faço para gerar o caminho certo com referência relativa?

Atualmente, está assim:

@Resource
public class IndexController {

	@Path("/")
	public void index() {
	
	}
	
	@Path("/relatorios")
	public Download relatorios() {
		File source = new File("resources/relatorios.tar.gz");
		System.err.println(source.getAbsolutePath());
		String contentType = "application/x-zip";
		String filename = "relatorios.tar.gz";
		
		return new FileDownload(source, contentType, filename);
	}
}

Alguém pode me ajudar?

Abraços,
Obrigado.

na web vc nunca pode usar arquivos relativos, pois depende mto da onde o servidor está rodando…

o ideal é vc receber o ServletContext no construtor, e fazer:

context.getRealPath("/resources/relatorios.tar.gz");

esse / é relativo à raiz web (pasta webapp por exemplo)

o ideal ainda é separar isso em um componente

Oi Lucas,

Mandei o método que faz o download para um componente e estou usando o ServletContext mas não sei o que fazer no Controller, agora o endereço do arquivo está certo mas não consigo fazer o download.

As alterações ficaram assim:

@Component
public class DownloadManager {
	private ServletContext context;
	
	public DownloadManager(ServletContext context) {
		super();
		this.context = context;
	}

	public Download downloadRelatorios() {
		File rel = new File(context.getRealPath("/WEB-INF/resources/relatorios.tar.gz"));
		System.err.println(source.getAbsolutePath());
		String contentType = "application/x-zip";
		String filename = "relatorios.tar.gz";
		
		return new FileDownload(rel, contentType, filename);
	}
}
@Resource
public class IndexController {
	DownloadManager downloadManager;
	
	public IndexController(DownloadManager downloadManager) {
		super();
		this.downloadManager = downloadManager;
	}

	@Path("/")
	public void index() {
	
	}
	
	@Path("/relatorios")
	public void relatorios() {
		downloadManager.downloadRelatorios();
	}
}

O que está errado?

Outra coisa, não consigo carregar o CSS das minhas páginas, isso tem alguma relação com esse problema dos caminhos?

faltou retornar o download no Controller:

@Path("/relatorios")  
    public Download relatorios() {  
        return downloadManager.downloadRelatorios();  
    }  

Lucas Cavalcanti, desculpe a pergunta, mas como ficaria a implementação no meu JSP? estou começando a utilizar o Vraptor agora e por isso tenho tantas duvidas.

[quote=Lucas Cavalcanti]faltou retornar o download no Controller:

@Path("/relatorios") public Download relatorios() { return downloadManager.downloadRelatorios(); } [/quote]

vc só precisa criar um link pra isso:

<a href="${linkTo[IndexController].relatorios}">Download</a>

quem clicar no link vai baixar o relatório.