Bom dia!
Sei que a melhor prática pra salvar arquivos em uma aplicação razoavelmente grande é gravar apenas a URL no banco de dados mas há um problema em aplicações WEB, o caminho real, fica em uma pasta temporária onde todos os arquivos são perdidos a cada vez que paro o Tomcat, e parece que sou obrigado a utilizar o método getRealPath, não há possibilidade de gravar esses arquivos dentro da minha aplicação no caminho do meu WorkSpace normal? Se há porque os exemplos que acho na internet são todos com esse getRealPath? Pois sempre que salvo nesse caminho temporário do Eclipse minhas imagens são perdidas a cada vez que paro o Tomcat, e ainda as imagens não são carregadas pelo graphicImage, alguém saberia me explicar tudo isso? Acredito que seja uma dúvida de muitos também, olha meu código.
ManagedBean
Faz upload dos arquivos
FacesMessage msg = new FacesMessage("Sucesso", event.getFile().getFileName() + " foi carregado.");
FacesContext.getCurrentInstance().addMessage("teste", msg);
String caminho = FacesContext.getCurrentInstance().getExternalContext().getRealPath("" + "/fotos/");
byte[] conteudo = event.getFile().getContents();
File file = new File(caminho);
file.mkdirs();
FileOutputStream fos = new FileOutputStream(file.getPath() + "/" + event.getFile().getFileName());
fos.write(conteudo);
fos.close();
Lista as imagens
public List<String> getCaminhoArquivos() throws IOException {
List<String> caminhoArquivos = new ArrayList<>();
File file = new File(FacesContext.getCurrentInstance().getExternalContext().getRealPath("/fotos/"));
if (file.exists()) {
Path dir = Paths.get(FacesContext.getCurrentInstance().getExternalContext().getRealPath("/fotos/"));
DirectoryStream<Path> stream = Files.newDirectoryStream(dir);
for (Path path : stream) {
caminhoArquivos.add(path.toAbsolutePath().toString());
}
}
return caminhoArquivos;
}
Mostra as imagens
<p:dataTable value="#{fileUploadView.caminhoArquivos}" var="arquivo">
<p:column headerText="Arquivo">
<h:graphicImage value="#{arquivo}" />
</p:column>
</p:dataTable>
Obrigado.