[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…