[RESOLVIDO]FILEUPLOAD PRIMEFACES - java.lang.NullPointerException

oi pessoal tudo bem…estou com um problema com upload de arquivos do primefaces, estou usando postgres e hibernate
segui o tutorial da MeninaJava
http://meninajava.blogspot.com.br/2012/01/fileupload-com-jsf-primefaces-hibernate.html

Nao grava no banco(fica null o caminho), e a imagem nao vai para o diretorio(fotos)

LOG DO APACHE:

Hibernate:
/* criteria query / select
this_.id_cat as id1_5_0_,
this_.nome_cat as nome2_5_0_
from
categoria this_
Hibernate:
/
criteria query / select
this_.id_cat as id1_5_0_,
this_.nome_cat as nome2_5_0_
from
categoria this_
Hibernate:
select
nextval (‘produto_id_produto_seq’)
=========== ENTROU NO METODO GRAVAR=================
ENTROU NO TRY DO METODO GRAVAR
java.lang.NullPointerException
==============CAIU NO CATCH DO METODO GRAVAR==================
ERRO toString(): java.lang.NullPointerException
ERRO getLocalizedMessage: null
ERRO getCause(): null
ERRO getStackTrace():[Ljava.lang.StackTraceElement;@3e78b671
ERRO getClass(): class java.lang.NullPointerException
Hibernate:
/
insert br.com.ecommerceetelj.model.Produto
*/ insert
into
produto
(id_cat, desconto_produto, descricao_produto, imagem_produto, nome_produto, preco_produto, qtd_produtodisponivel_produto, id_produto)
values
(?, ?, ?, ?, ?, ?, ?, ?)

xml

<!--Configuração fileUpload -->
   <filter>

<filter-name>PrimeFaces FileUpload Filter</filter-name>
<filter-class>
org.primefaces.webapp.filter.FileUploadFilter
</filter-class>
<init-param>
<param-name>uploadDirectory</param-name>
<param-value>C:/temp</param-value>
</init-param>
<init-param>
<param-name>thresholdSize</param-name>
<param-value>10000</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>

UploadArquivo.class

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.ecommerceetelj.bean;

import java.io.File;
import java.io.FileOutputStream;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletResponse;
import org.primefaces.event.FileUploadEvent;

/**
 *
 * @author Vagner Sistemas
 */
public class UploadArquivo{    

	private String caminho;
	private byte[] arquivo;
	private String nome;
	
	public UploadArquivo() {
	}

	public String getNome() {
	return nome;
	}

	public String getRealPath() {
	ExternalContext externalContext = 
                FacesContext.getCurrentInstance().getExternalContext();
	HttpServletResponse response = 
                (HttpServletResponse) externalContext.getResponse();
	
	FacesContext aFacesContext = FacesContext.getCurrentInstance();
	ServletContext context = 
               (ServletContext) aFacesContext.getExternalContext().getContext();
	
	return context.getRealPath("/");            
	}
	
	public void fileUpload(FileUploadEvent event, String type, String diretorio) {
            System.out.println("ENTROU METODO FILEUPLOAD");
            System.out.println("VALOR EVENT: "+event);
            System.out.println("TIPO: "+type);              
            System.out.println("DIRETORIO: "+diretorio);
	try {
	this.nome = new java.util.Date().getTime() + type;
         System.out.println("VALOR VARIAVEL NOME: "+this.nome);
	this.caminho = getRealPath() + diretorio + getNome();
         System.out.println("VALOR VARIAVEL CAMINHO: "+this.caminho);
	this.arquivo = event.getFile().getContents();
         System.out.println("VALOR VARIAVEL ARQUIVO: "+this.arquivo);
	
	File file = new File(getRealPath() + diretorio);
	file.mkdirs();
         System.out.println("VALOR FILE: "+file);
	
	} catch (Exception ex) {
	System.out.println("Erro no upload do arquivo" + ex);
	}
	}
	
	public void gravar(){
	           System.out.println("=========== ENTROU NO METODO GRAVAR=================");
	try {
            System.out.println("ENTROU NO TRY DO METODO GRAVAR");
	FileOutputStream fos;
	fos = new FileOutputStream(this.caminho);
            System.out.println("VALOR VARIVAEL CAMINHO NO METODO GRAVAR: "+this.caminho);
	fos.write(this.arquivo);
	fos.close();
	
	} catch (Exception ex) {
	System.out.println(ex);
            System.out.println("ERRO toString(): "+ex.toString());
            System.out.println("ERRO getLocalizedMessage: "+ex.getLocalizedMessage());
            System.out.println("ERRO getCause(): "+ex.getCause());
            System.out.println("ERRO getStackTrace():"+ex.getStackTrace());
            System.out.println("ERRO getClass(): "+ex.getClass());
	}
	
	}    
}

ProdutoBean

[code]
//METODO PARA O FIPLEUPLOAD=================================================
public void uploadAction (FileUploadEvent event){
this.arquivo.fileUpload(event, “.jpg”, “/fotos/”);
this.produto.setImagemProduto(this.arquivo.getNome());
}

public String salvar(){

ProdutoRN produtoRN = new ProdutoRN();
produtoRN.salvar(produto);
//chama metoda da classe UploadArquivo
this.arquivo.gravar();
this.produto = new Produto();
this.arquivo = new UploadArquivo();

//retorna para a pagina sucessoproduto.xhtml
return destinoSalvarProduto;
}
[/code]

mostra o seu formulário de envio.

Quando eu chegar em casa a noite te passo a forma que eu fiz, pode ser que lhe ajude a resolver este problema.

Esse tópico pode te ajudar.

http://www.guj.com.br/java/283339-selecionar-multiplos-arquivos-de-uma-pasta

VOU DAR UMA OLHADA…VLW…ABRAÇOSS

entao meu form esta da seguinte maneira(obs:omiti outros atributos que sao cadastrados ao mesmo tempo)
BIBLIOTECAS ADICIONADA
commons-fileupload-1.2.2-bin
commons-io-2.4-bin


 <h:body>
        <h1>Cadastrar Produto</h1>
        
         <h:form id="cadastrarproduto" enctype="multipart/form-data">
  <h:panelGrid columns="2">

. 
.
.
.
 <h:outputLabel value="Imagem" for="imagem"/>
                <p:fileUpload id="imagem"  fileUploadListener="#{produtoBean.uploadAction(event)}" auto="true">
                </p:fileUpload>
.
.
.
  </h:panelGrid>
             
             <h:commandButton action="#{produtoBean.salvar()}" value="Salvar"/>
            
        </h:form>

se tiver um exemplo de um crud com foto , ajudaria muito…eh um cadastro de produtos com foto…vlw

Fiz com base nesse http://www.primefaces.org/showcase-labs/ui/fileUploadSingle.jsf

Segue um exemplo.

XHTML

<h:outputLabel for="valor" value="Imagem:" /> <h:panelGroup> <p:fileUpload fileUploadListener="#{beanProduto.handleFileUpload}" mode="advanced" update="messages" sizeLimit="1000000" allowTypes="/(\.|\/)(gif|jpe?g|png)$/"/>

Bean

public void handleFileUpload(FileUploadEvent event) { // salvando arquivo byte[] conteudo = event.getFile().getContents(); String caminho; ProdutoDAO produtoDAO = new ProdutoDAO(); if (produto.getId() > 0){ caminho = "C:\\img\\" + produto.getId() + ".jpg"; }else{ caminho = "C:\\img\\" + (produtoDAO.lastId()+1) + ".jpg"; } try { FileOutputStream fos = new FileOutputStream(caminho); fos.write(conteudo); fos.close(); FacesMessage msg = new FacesMessage("Arquivo", event.getFile() .getFileName() + " salvo com sucesso."); FacesContext.getCurrentInstance().addMessage(null, msg); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }

eai jeffev blz…primeiramente vlw ai pela ajuda…

entao ainda nao consegui fazer funcionar , o meu handleFileUpload esta um pouco diferente do seu
nao consegui usar o lastId()+1 , aqui nao completa na sugestao.
caminho = “C:\img\” + (produtoDAO.lastId()+1) + “.jpg”;
criei o pasta img em C: e no else como nao usei o last so coloquei um System.out para saber q caiu la…ai nao deu certo , nao da nenhum erro
mais nao aparece nenhum imagen na pasta img em C:\img

qual eh sua config no web.xml?

public void handleFileUpload(FileUploadEvent event) {  
            // salvando arquivo  
            byte[] conteudo = event.getFile().getContents();  
            System.out.println("VALOR CONTEUDO: "+conteudo);
            String caminho = null;  
            ProdutoDAO produtoDAO = new ProdutoDAOImpl();  
            if (produto.getIdProduto() > 0){  
                caminho = "C:\\img\\" + produto.getIdProduto() + ".jpg"; 
                System.out.println("CAMINHO: "+caminho);
            }else{  
               
                //caminho = "C:\\img\\" + (produtoDAO.+1) + ".jpg";  
              System.out.println("CAIU NO ELSE");
            }  
            try {  
                FileOutputStream fos = new FileOutputStream(caminho);  
                System.out.println("VALOR VARIVEL CAMINHO NO TRY: "+caminho);
                fos.write(conteudo);  
                fos.close();  
                FacesMessage msg = new FacesMessage("Arquivo", event.getFile()  
                        .getFileName() + " salvo com sucesso.");  
                FacesContext.getCurrentInstance().addMessage(null, msg);  
            } catch (FileNotFoundException e) {  
                System.out.println("ERRO FileNotFoundException: "+e.getMessage());
            } catch (IOException e) {  
                // TODO Auto-generated catch block  
                System.out.println("ERRO IOException: "+e.getMessage());
                 
            }  
        }

O Q ESTOU FAZENDO DE ERRADO!!
ABRAÇOSS

Tentou ver se ele está executando o método ao fazer o upload da imagem?

XML

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>Skyzz</display-name> <welcome-file-list> <welcome-file>index.jsf</welcome-file> </welcome-file-list> <context-param> <param-name>config-file</param-name> <param-value>WEB-INF/classes/quartz.properties</param-value> </context-param> <context-param> <param-name>primefaces.THEME</param-name> <param-value>midnight</param-value> </context-param> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.jsf</url-pattern> </servlet-mapping> <context-param> <description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description> <param-name>javax.faces.STATE_SAVING_METHOD</param-name> <param-value>client</param-value> </context-param> <context-param> <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name> <param-value>resources.application</param-value> </context-param> <filter> <filter-name>PrimeFaces FileUpload Filter</filter-name> <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class> </filter> <context-param> <param-name>primefaces.PRIVATE_CAPTCHA_KEY</param-name> <param-value>6LcROdYSAAAAACzas7GoOcisl0xWIsBAZ2xPsfhe</param-value> </context-param> <context-param> <param-name>primefaces.PUBLIC_CAPTCHA_KEY</param-name> <param-value>6LcROdYSAAAAAPVHeL8_P573uM97ucMQVGe-EEyl</param-value> </context-param> <filter-mapping> <filter-name>PrimeFaces FileUpload Filter</filter-name> <servlet-name>Faces Servlet</servlet-name> </filter-mapping> <listener> <listener-class>com.sun.faces.config.ConfigureListener</listener-class> </listener> <listener> <listener-class>util.ContaUsers</listener-class> </listener> </web-app>

eai pessoal tudo bem…entao consegui fazer de um jeito aqui o upload da imagem, mudei no bean de @request para @ session e funcionou , porem qndo tento cadastrar pela primeira vez nao d acerto , vai nulo o caminho no banco , ai tento cadastrar de novo ai da certo , sempre na primeira vez nao da , so na segunda…alguma ideia do que eh isso, ja tentei usar @ApplicationScope e tbem nao deu certo!!!

vlw