É bom que isso fique documentado aqui no GUJ mesmo, quebrei minha cabeça loucamente com esse componente deles e depois acabei descobrindo que a documentação do site deles está incompleta (showcase).
Para fazer o upload de arquivos funcionar é necessário ter as bibliotecas commons-io e commons-fileupload no class-path e mapegar um filtro no web.xml
fileUploadListener="#{cadastroAnimalController.carregarArquivo}" //atributo de <p:fileUpload>
E implemento o método no controller:
public void carregarArquivo(FileUploadEvent event) // metodo chamado quando o arquivo acaba de carregar no serverSide
throws FileNotFoundException, IOException {
FacesMessage msg = new FacesMessage("Sucesso "+event.getFile().getFileName()+" foi carregado.", event.getFile()
.getFileName() + " foi carregado."); // mensagem pra saber se ouve sucesso
arquivo = event.getFile().getFileName(); // pego o nome do arquivo
String caminho = FacesContext.getCurrentInstance().getExternalContext()
.getRealPath("\\fotos\\"+arquivo ); // diretorio o qual vou salvar o arquivo do upload, equivale ao nome completamente qualificado
byte[] conteudo = event.getFile().getContents(); // daqui pra baixo é somente operações de IO.
FileOutputStream fos = new FileOutputStream(caminho);
fos.write(conteudo);
fos.close();
}
Galera persistencia é tudo nessa vida, acabei de descobrir o problema
Faltava apenas isso *.jsf
<filter-mapping>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern> // AQUI ESTAVA O PROBLEMA FALTAVA ESSA LINHA NO WEB.XML
</filter-mapping>
existem varias coisinhas para vc mudar por exemplo vc está cometendo o mesmo erro que eu penei para sanar, vc não está mapeando a url no filter nas configurações do Web.xml , depois de corrigir tente desenvolver o primeiro modelo proposto pela documentação do PrimeFaces
Comigo aconteceu a mesma coisa, funcionava o exemplo postado acima e no meu projeto não… aí identifiquei que no filtro eu tava colocando a minha classe e não: org.primefaces.webapp.filter.FileUploadFilter
Quando corrigi isso passou a funcionar, porém ainda tenho uma dúvida, o componente filepuload só gera um arquivo temporário do arquivo que foi feito o uploade e eu tenho que fazer uma cópia “na mão” depois??? é esse o esquema mesmo???