FileDownload + Múltiplos Arquivos

Pessoal, alguém ai sabe como implantar um FileDownload do PrimeFaces com vários arquivos?

Tenho um módulo no sistema, onde o usuário poderá enviar arquivos com formato .pdf e .doc.

A intenção é que em outra página do sistema, seja possível baixar esses arquivos enviados.

Tentei fazer utilizando o código disponível em http://softwarenosso.blogspot.com.br/2012/06/multiplos-downloads-com-prime-faces.html, mas gera erro no código no trecho:

 for (StreamedContent f : files) {
  if (fileName != null && f.getName().equals(fileName)) {
   file = f;
  }
 }

Informando que files é tipo Object e não do tipo StreamedContent…

Alguém pode me ajudar? :smiley:

Altere o trecho:

private List files;

para:

private List <StreamedContent >files;

Tente o seguinte código:

[code]public class FileDownloadController {
private List files;

private StreamedContent file;

public FileDownloadController() {
	files = new ArrayList<StreamedContent>();
	
	for (int i = 0; i < 3; i++) {
		InputStream stream = ((ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext())
				.getResourceAsStream("/images/optimusprime.jpg");
		file = new DefaultStreamedContent(stream, "image/jpg","downloaded_optimus.jpg");
		files.add(file);
	}
}

public List<StreamedContent> getFiles() {
	return files;
}

public StreamedContent getFile() {
	String fileName = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("fileName");

	for (StreamedContent f : files) {
		if (fileName != null && f.getName().equals(fileName)) {
			file = f;
		}
	}
	return file;
}

}[/code]

[quote=hmsilva]Tente o seguinte código:

[code]public class FileDownloadController {
private List files;

private StreamedContent file;

public FileDownloadController() {
	files = new ArrayList<StreamedContent>();
	
	for (int i = 0; i < 3; i++) {
		InputStream stream = ((ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext())
				.getResourceAsStream("/images/optimusprime.jpg");
		file = new DefaultStreamedContent(stream, "image/jpg","downloaded_optimus.jpg");
		files.add(file);
	}
}

public List<StreamedContent> getFiles() {
	return files;
}

public StreamedContent getFile() {
	String fileName = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("fileName");

	for (StreamedContent f : files) {
		if (fileName != null && f.getName().equals(fileName)) {
			file = f;
		}
	}
	return file;
}

}[/code][/quote]

hmsilva, obrigado pela ajuda.

Esse código funciona… eu já havia testado, mas ele repete 3 vezes o mesmo arquivo… No meu caso, quando eu envio o arquivo, eu salvo no banco, o caminho do arquivo.
Eu tentei portanto, esse código com a seguinte alteração.

public FileDownloadController() {
		files = new ArrayList<StreamedContent>();
		listaArquivosEnviados = exames.arquivosenviados(idUsuario); // Busca no banco, o caminho dos arquivos enviados.

for(TbExamesEnviados x : listaArquivosEnviados) {
		for (int i = 0; i < listaArquivosEnviados.size(); i++) {
			InputStream stream = ((ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext())
					.getResourceAsStream("/exames/" + x.getCaminho());
			file = new DefaultStreamedContent(stream, "application/download", x.getCaminho()); //O nome a ser exebido, será o próprio nome do arquivo
			files.add(file);
		}
}
	}

Não gera erro, mas também não lista os arquivos. Acredito que o poblema seja que o código é executado no construtor. Assim que abro a página onde irá aparecer os download, ele já busca o código, antes de eu selecionar o usuário para buscar os respectivos arquivos. E quando eu seleciono o usuário, ele não faz a busca de novo…

Voce pode colocar a lógica de carga de arquivo num metodo:

[code]public void carregaArquivos() {
files = new ArrayList();
listaArquivosEnviados = exames.arquivosenviados(idUsuario); // Busca no banco, o caminho dos arquivos enviados.

	for(TbExamesEnviados x : listaArquivosEnviados) {  
	        for (int i = 0; i < listaArquivosEnviados.size(); i++) {  
	            InputStream stream = ((ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext())  
	                    .getResourceAsStream("/exames/" + x.getCaminho());  
	            file = new DefaultStreamedContent(stream, "application/download", x.getCaminho()); //O nome a ser exebido, será o próprio nome do arquivo  
	            files.add(file);  
	        }  
	}  
} [/code]

E no seu xhtml vc coloca um listener na seleção do usuario pra chamar o metodo pra carregar os aquivos. E atualiza o componente onde a lista de arquivos está.

[quote=hmsilva]Voce pode colocar a lógica de carga de arquivo num metodo:

[code]public void carregaArquivos() {
files = new ArrayList();
listaArquivosEnviados = exames.arquivosenviados(idUsuario); // Busca no banco, o caminho dos arquivos enviados.

	for(TbExamesEnviados x : listaArquivosEnviados) {  
	        for (int i = 0; i < listaArquivosEnviados.size(); i++) {  
	            InputStream stream = ((ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext())  
	                    .getResourceAsStream("/exames/" + x.getCaminho());  
	            file = new DefaultStreamedContent(stream, "application/download", x.getCaminho()); //O nome a ser exebido, será o próprio nome do arquivo  
	            files.add(file);  
	        }  
	}  
} [/code]

E no seu xhtml vc coloca um listener na seleção do usuario pra chamar o metodo pra carregar os aquivos. E atualiza o componente onde a lista de arquivos está.[/quote]

Cara, estava aqui fazendo testes, debbugando e coisa e tal.

Quando seleciono um usuário, ele chama o carregaArquivos() e traz todos os dados certinhos. Essa tela, onde os arquivos deveriam aparecer, é composta com várias tabs…
Quando abro a tab específica dos arquivos enviados, ele me traz uma nova instância das variáveis da classe e por consequência, não mostra os dados na tela, pois o listaArquivosEnviados fica nulo…