Ajuda com p:fileUpload... JSF 2.0 + Primefaces

Bom dia!

não estou conseguindo usar o p:fileUpload do Primefaces…
já olhei todos os topicos no GUJ sobre isso e nenhum deu resultado…

bibliotecas:
commons-fileupload-1.2.2.jar
commons-io-2.0.jar

web.xml

    <filter>
        <filter-name>PrimeFaces FileUpload Filter</filter-name>
        <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>PrimeFaces FileUpload Filter</filter-name>
        <servlet-name>Faces Servlet</servlet-name>
    </filter-mapping>

bean:

    public void fileUploadAction(FileUploadEvent event) {
        UploadedFile file = event.getFile();
        nomeArquivo = file.getFileName();
        try {
            FileOutputStream fos = new FileOutputStream("C:\\teste\\" + nomeArquivo);
            fos.write(file.getContents());
            fos.flush();
            fos.close();
        } catch (Exception ex) {
            Logger.getLogger(BeanExame.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
//metodo pra gravar
    public void gravar() {
        try {
            addPaciente();
            anexo.setDataAnexo(new Date());
            anexo.setEndAnexo(nomeArquivo);
            DaoExame.merge(anexo);
            anexo = new CPExame();
            SessionUtil.addSuccessMessage("OperacaoSucesso");

        } catch (Exception e) {
            SessionUtil.addErrorMessage("OperacaoFracasso");
            System.out.print(nomeArquivo);
        }
    }

xhtml:


	<h:form id="formAnexarExames">
            
            <p:growl showDetail="true"/>
            
            <p:panel header="Anexar exame a um paciente">
                
                    <h:outputLabel value="Paciente:* " for="paciente"/>
                    <p:selectOneMenu id="paciente" value="#{beanConsulta.idPaciente}" style="width: 300px" required="true" requiredMessage="Preencha o campo Paciente!">
                        <f:selectItem itemLabel="Selecione " itemValue=""/>
                        <f:selectItems value="#{beanPaciente.pacientes}" var="p" itemValue="#{p.id}" itemLabel="#{p.nome}"/>
                    </p:selectOneMenu>

                    <p:fileUpload sizeLimit="1000000" auto="true" widgetVar="uploader" label="Procurar..."
                                  fileUploadListener="#{beanExame.fileUploadAction}" 
                                  allowTypes="*.jpg;*.png;*.gif;" update="formAnexarExames" multiple="false" 
                                  required="true" id="upaArquivos">
                    
                    </p:fileUpload>
                    
                    <p:commandButton value="Gravar" action="#{beanExame.gravar()}" update="formAnexarExames"/>
              
            </p:panel>
	</h:form>

Simplesmente não aparece naaaada…

Alguém pode me ajudar??

tenta colocar seu form como abaixo:

<h:form id="formAnexarExames"  enctype="multipart/form-data"> 

Olá jakefrog…

cara coloquei o que você sugeriu, mas continua a mesma coisa…

será que é bug do Primefaces 3.0.M1?

É não sei. Tenta o m4 que já lançaram.

Fala Felipe, conforme conversei contigo verifica algumas coisas:

1 - o seu bean deve implementar a interface java.io.Serializable

2 - o windows pode esta bloqueado a operação de salvar arquivo por você está tentando salvar no “C:”, tente salvar o arquivo em outra partição como “D:”

3 - Verifique se realizou os imports corretos.

import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.UploadedFile;

4 - Verifique o escopo do seu bean (recomendo usar @ViewScoped)

5 - Como te disse, pode ser problema na versão do primefaces que você esta usando, pois não é uma versão estável. Na dúvida, tente utilizar uma versão mais recente (3.0.M4) ou a última versão estável (2.2.1)

[EDITADO]

6 - Verifica se a versões dos commons-fileupload e commons-io que você está utilizando são compatíveis com a versão do primefaces que você utiliza. (Na documentação, disponível no site, diz qual versão deve ser usada)

Abraços.

Fiz um pequeno exemplo aqui onde o arquivo o usuário seleciona o arquivo, manda anexar e então o bean guarda uma referência desse arquivo para salvar posteriormente, após clicar no botão “Gravar”. Dessa forma o arquivo só seria salvo se o usuário completasse o cadastro, por exemplo.

No seu código, logo após o usuário selecionar o arquivo o mesmo já é salvo, supondo que o usuário desista do cadastro você ficaria com um arquivo “sem dono”. Enfim, isso é uma questão de regra de negócio.

Irei posta o código para que você possa olhar e quem saber te ajudar.

ManagedBean

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.UploadedFile;

@ManagedBean
@ViewScoped
public class UploadBean implements java.io.Serializable {

    private UploadedFile arquivo;

    /* Construtor */
    public UploadBean() {
    }

    /* Get e Set */
    public UploadedFile getArquivo() {
        return arquivo;
    }

    public void setArquivo(UploadedFile arquivo) {
        this.arquivo = arquivo;
    }

    /* Fim Get e Set */
    /**
     * Trata o evento de upload e guarda uma referencia para o
     * arquivo no bean
     * @param evento 
     */
    public void uploadListener(FileUploadEvent evento) {
        this.arquivo = evento.getFile();

        FacesContext ctx = FacesContext.getCurrentInstance();
        FacesMessage msg = new FacesMessage();

        msg.setSummary("Arquivo anexado com sucesso.");
        msg.setSeverity(FacesMessage.SEVERITY_INFO);

        ctx.addMessage("mensagens", msg);

    }

    /**
     * Salvar o arquivo
     * @return 
     */
    public String salvar() {

        FacesContext ctx = FacesContext.getCurrentInstance();
        FacesMessage msg = new FacesMessage();

        String nomeArquivo = arquivo.getFileName(); //Nome do arquivo enviado
        byte[] conteudo = arquivo.getContents(); //Conteudo a ser gravado no arquivo

        File file = new File("D:\\" + nomeArquivo); //Cria uma referencia para arquivo no caminho passado

        try {

            //Escreve o arquivo e salva
            FileOutputStream fos = new FileOutputStream(file);
            fos.write(conteudo);
            fos.flush();
            fos.close();

            msg.setSummary("Arquivo salvo com sucesso!");
            msg.setSeverity(FacesMessage.SEVERITY_INFO);

        } catch (IOException ex) {

            msg.setSummary(ex.getMessage());
            msg.setSeverity(FacesMessage.SEVERITY_ERROR);

        } finally {
            ctx.addMessage("mensagens", msg);
            return null;
        }

    }
}

Página

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:p="http://primefaces.prime.com.tr/ui"
      xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        
        <p:messages id="mensagens" showSummary="true"/>
        
        <h:form>
            <p:fileUpload fileUploadListener="#{uploadBean.uploadListener}" update="mensagens"/><br/>
            <p:commandButton value="Gravar" update="mensagens" action="#{uploadBean.salvar()}"/>
        </h:form>
        
    </h:body>
</html>

Estou utilizando o Primefaces versão 2.2.1 (primefaces-2.2.1.jar) e as dependências “commons-fileupload-1.1.jar” e “commons-io-1.4.jar” e executando no servidor “Apache Tomcat 7.0.11”

Abraços

Galera…

Vlw pela a ajuda, mas nada resolveu, limpei e construi o projeto, refiz ele, usei os commons mais aplicações q precisava escrever arquivos, meu escopo [e do tipow ViewScoped, j[a tinha serializado o bean…

acho q o prob é na versão do primefaces mesmo…=/

Muda para a última versão estável (2.2.1) e faz o teste… =)
ai posta o resultado para quem tiver o mesmo problema saber se resolveu ou não trocar a versão do primefaces.

Abraços

flpmchd blz?

você teve sucesso?

to com o mesmo problema

olá carolino…

a solução foi mudar para a versão 3.0.M4 do Primefaces…

fiz igual ao exemplo que o gilvan postou que é pra não salvar sem salvar no banco…

rodou perfeitamente bem…

abraços

Bom… vou tentar replicar o exemplo com o M4

obrigado amigo…

Cara…

Repliquei esse exemplo e acontece a mesma coisa… ou seja "infelismente nada :frowning: "

To desconfiando que os jars commons-fileupload e commons-io que to usando

tão dando algum tipo de imcompatibilidade, mesmo assim tentei outras versões e nada…

Vocês poderiam me dizer qual versão dos jars commons-fileupload e commons-io

que vocês tão utilizando?

O user’s Guide do Primefaces 3.0.M4 recomenta usar o commons-fileupload-1.2.1 e o commons-io-1.4

testa ae…

É… infelizmente ainda não foi ;~

Depois de muita dor de cabeça finalmente consegui fazer o upload
de arquivos funcionar com o Primefaces M4

As mudanças mais significativas foram no web.xml que acredito que estava
mal configurado no projeto

vou postar aqui caso possa ajudar alguem

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
	id="WebApp_ID" version="2.4"&gt;
	&lt;context-param&gt;
	&lt;param-name&gt;javax.faces.STATE_SAVING_METHOD&lt;/param-name&gt;
	&lt;param-value&gt;server&lt;/param-value&gt;
	&lt;/context-param&gt;
	&lt;filter&gt;
		&lt;filter-name&gt;FilterBloqueaPaginas&lt;/filter-name&gt;
		&lt;filter-class&gt;br.com.acessavale.controller.security.FilterPaginasBloqueadas&lt;/filter-class&gt;
	&lt;/filter&gt;
	&lt;filter-mapping&gt;
		&lt;filter-name&gt;FilterBloqueaPaginas&lt;/filter-name&gt;
		&lt;url-pattern&gt;/menu/*&lt;/url-pattern&gt;
	&lt;/filter-mapping&gt;
	&lt;servlet&gt;
		&lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
		&lt;servlet-class&gt;javax.faces.webapp.FacesServlet&lt;/servlet-class&gt;
	&lt;/servlet&gt;
	&lt;servlet-mapping&gt;
		&lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
		&lt;url-pattern&gt;*.faces&lt;/url-pattern&gt;
	&lt;/servlet-mapping&gt;
	&lt;welcome-file-list&gt;
		&lt;welcome-file&gt;home.faces&lt;/welcome-file&gt;
	&lt;/welcome-file-list&gt;
	&lt;servlet&gt;
		&lt;servlet-name&gt;ImageServlet&lt;/servlet-name&gt;
		&lt;servlet-class&gt;br.com.acessavale.servlet.ImageServlet&lt;/servlet-class&gt;
	&lt;/servlet&gt;
	&lt;servlet-mapping&gt;
		&lt;servlet-name&gt;ImageServlet&lt;/servlet-name&gt;
		&lt;url-pattern&gt;/ImageServlet&lt;/url-pattern&gt;
	&lt;/servlet-mapping&gt;
	&lt;filter&gt;
		&lt;filter-name&gt;PrimeFaces FileUpload Filter&lt;/filter-name&gt;
		&lt;filter-class&gt;org.primefaces.webapp.filter.FileUploadFilter&lt;/filter-class&gt;
	&lt;/filter&gt;
	&lt;filter-mapping&gt;
		&lt;filter-name&gt;PrimeFaces FileUpload Filter&lt;/filter-name&gt;
		&lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
	&lt;/filter-mapping&gt;
	&lt;session-config&gt;
		&lt;session-timeout&gt;30&lt;/session-timeout&gt;
	&lt;/session-config&gt;
&lt;/web-app&gt;