FileDownload + Múltiplos Arquivos

5 respostas
A

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:

5 Respostas

H

Altere o trecho:

private List files;

para:

private List <StreamedContent >files;
H

Tente o seguinte código:

public class FileDownloadController {
	private List<StreamedContent> 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;
	}
}
A
hmsilva:
Tente o seguinte código:
public class FileDownloadController {
	private List<StreamedContent> 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;
	}
}

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

H

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

public void carregaArquivos() {  
        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);  
		        }  
		}  
    }

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á.

A
hmsilva:
Voce pode colocar a lógica de carga de arquivo num metodo:
public void carregaArquivos() {  
        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);  
		        }  
		}  
    }

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á.

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

Criado 4 de dezembro de 2012
Ultima resposta 4 de dez. de 2012
Respostas 5
Participantes 2