Primefaces Fileupload executa 2x

olá,

bom, eu to fazendo uma tela de cadastro de pessoas aonde nessa tela tem o formulário com campos e a opção da pessoa inserir uma foto. Vale lembrar que a pessoa pode editar tanto seus dados como as imagens.

Usando o FILEUPLOAD do Primefaces eu consigo fazer o upload da imagem e salva-la em um diretório e o nome da imagem eu guardo em um BD.
Posteriormente quando eu clico no botão ATUALIZAR parece que ele executa o método de UPLOAD e ae o atributo nomeArquivo não é setado e consequentemente grava NULL no BD.

Alguém já passou por isso ?

Ricardo

posta seu managedBean e o xhtml,jsp etc !

Ta ae o .xhtml

<h:form  id="form" prependId="false" enctype="multipart/form-data" >					
... // Campos para o cadastro de Pessoas
			<p:fileUpload 	allowTypes="*.jpg;*.png;*.gif;"
     						auto="false"     						
     						description="Imagem"
     						fileUploadListener="#{usuarioMB.uploadFile}"
     						label="Selecionar Arquivo"
     						multiple="false" />    					
     		<br/>
     		<h:commandLink value="Editar" action="#{usuarioMB.atualizarUsuario}" /><br/>	     	
    	</h:form>

o Managed-Bean …

public class UsuarioMB implements Serializable {

	private StreamedContent paginaFoto;
        private Usuario usuario;

        // Getters e Setters

       public String atualizarUsuario() {
		
		try {			
			this.setUsuario(usuarioComponent.alterarUsuario(usuario));			
			return "sucesso";
			
		} catch(BusinessException e) {
			return "erro";
		}
	}

        public void uploadFile(FileUploadEvent event) {	
				
		byte[] foto = event.getFile().getContents();
		String nomeArquivo = event.getFile().getFileName();
		
		ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();		
		String caminhoArquivo = servletContext.getRealPath("/WEB-INF/classes/upload") + 
					File.separator + this.getUsuario().getId() + this.getUsuario().getNome() + File.separator;			
		
		this.getUsuario().setFoto(nomeArquivo);
		
		try {			
			criarArquivo(caminhoArquivo, nomeArquivo, foto);
		} catch(IOException ex) {
			System.out.println("NAO FOI POSSIVEL GRAVAR ARQUIVO EM DISCO");
		}
	}

Tanto que quando aperta o botão ATUALIZAR a msg “NAO FOI POSSIVEL GRAVAR ARQUIVO EM DISCO” aparece e seu printar o valor do nome da foto aparece vazio.

qual é o scopo?

request

bom eu acredito que seja, porque esta como requestScope, na hora que vc faz o upload ele faz uma requisicao e pega o arquivo tudo certinho e vc esta atribuindo o arquivo a uma variavel local, qnd vc clicar no botao atualizar é uma nova requisicao, ou seja, o seu managedBean vai ser criado novamente e ele perder a referencia do arquivo.

desculpa nao vi sua mensagem [quote]Tanto que quando aperta o botão ATUALIZAR a msg “NAO FOI POSSIVEL GRAVAR ARQUIVO EM DISCO” aparece e seu printar o valor do nome da foto aparece vazio. [/quote]

coloca um printStackTrace(); no catch pode esta ocasionando um erro e vc nao esta vendo !
mas ainda considero meu post acima !

catch(IOException ex) { 
            ex.printStackTrace();
            System.out.println("NAO FOI POSSIVEL GRAVAR ARQUIVO EM DISCO");   
        }  

ok dijava,

Agora estou em ksa. Amanhã eu testo suas sugestões e espero contar com a sua ajuda.

Obrigado
Ricardo

olá,

coloquei o escopo de sessão e continua vazio.

No printStackTrace mostra o seguinte erro.

NAO FOI POSSVEL GRAVAR EM DISCO
ERRO: java.io.FileNotFoundException: C:\path\ate\o\caminho\da\foto (Acesso Negado)

Sendo que a imagem está lá no diretório correto.

Ricardo