FileUpload do PrimeFaces não chama fileUploadListener

28 respostas
C

Eaew gente boa, fmz?

FileUpload do PrimeFaces não chama fileUploadListener, alguem sabe porque???

<p:fileUpload auto=“true” allowTypes=".jpg;.png;*.gif;" description=“Imagens” sizeLimit=“300000” fileUploadListener="#{beanAdmin.handleFileUpload(event)}"/>

public void salvarImagem(File arquivo) {
    if (arquivo != null) {
        System.out.println(arquivo.getName());
    } else {
        System.out.println("dsasa");
    }
}

28 Respostas

A

Altere a configuração do STATE_SAVING_METHOD para server.

Para configurar esta opção basta colocar o código abaixo no arquivo web.xml:

&lt;context-param&gt; 
&lt;description&gt; 
State saving method: ?client? or ?server? (= default) See 
JSF Specification 2.5.2 
&lt;/description&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;

Veja os pos e contras.

Diferença:

Método server

 um maior consumo de memória no lado servidor pois o estado esta sendo mantido na sessão por usuário;

problemas com o back-button do browser (é necessário mais consumo de memória para resolver este problema);

baixo consumo de banda na rede;

baixo consumo de memória no cliente;

uso de cpu no servidor é baixo;

clustering ? mover a sessão para um outro  do cluster (muitos dados na sessão);

melhora comunição via AJAX pois não é preciso reenviar o estado da view ao servidor;

páginas carregam mais rapidamente (ou pode-se dizer normalmente?);

Método client

menos uso da session e consequentemente menos consumo de memória no lado servidor;

sem consumo de memória entre requests;

corrige problemas de refresh (tecla F5) e botão voltar (back button) do browser;

resolve problemas de concorrência;

melhora escalabilidade da aplicação;

alto consumo de banda da rede;

maior overhead de cpu no servidor e cliente;

maior consumo de memória no lado cliente;

problemas de segurança;

excelente na fase de desenvolvimento pois conseguimos manter o estado da view mesmo depois de restartar o servidor;

páginas carregam ligeiramente mais lentas (isso depende muito da complexidade e quantidade de componentes na página);

Se resolver poe o titulo como resolvido.

L

consiguiram resolver ?

A

Eu abandonei fazer via primefaces, fiz usando jsf mesmo, faz uma pesquisa por upload com jsf que vc vai conseguir.

J

Pra fazer upload com Primefaces e necessário adicionar algumas configurações no web.xml
Caso não tenha feito…

&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;
L

Galera já fiz uma vez o upload do primefaces e do rich faces funcionado inclusive vou posta no meu blog, só que estou tendo problema com o primefaces
upload + o seam não consegui fazer então fiz logo com richfaces, pois a empresa não espera

L

Esta tudo mapeado, pois como disse já tinha feito uma antes, mais com o seam ele que controla os filtros, e o prime não chega nem a chamar o metodo fileListener(UploadFile event)… não entendi ainda vou pesaquisar sobre,
caso ache a resposta posto aqui… se alguem também achar seria bom :slight_smile:

T

Voc encontrou a resposta para que ele chamasse o metodo listener do fileupload ?

L

Sim, mais você ta usando jsf2 ou jsf1.2 ? e posta seu código!

M
<p:fileUpload
					fileUploadListener="#{beanAdmin.handleFileUpload}"
					update="mensagens" multiple="true"  />

tente assm

T

luirton:
Esta tudo mapeado, pois como disse já tinha feito uma antes, mais com o seam ele que controla os filtros, e o prime não chega nem a chamar o metodo fileListener(UploadFile event)… não entendi ainda vou pesaquisar sobre,
caso ache a resposta posto aqui… se alguem também achar seria bom :)

Bom dia pessoal,

Estou a 3 dias tentando fazer o upload automático do primefaces, pesquisei nos fóruns, mas nenhuma das alternativa e soluções me adiantaram, pois o upload não chamou o método do java. Atualmente os meu arquivos estão com a seguinte configuração e códigos:

web.xml ( Parte do código xml )

<filter>  
        <filter-name>PrimeFaces FileUpload Filter</filter-name>  
        <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>  
        <init-param>  
            <param-name>thresholdSize</param-name>  
            <param-value>51200</param-value>  
        </init-param>  
        <init-param>  
            <param-name>uploadDirectory</param-name>  
            <param-value>C:\temp</param-value>  
        </init-param>  
    </filter>  
    <filter-mapping>  
        <filter-name>PrimeFaces FileUpload Filter</filter-name>  
        <servlet-name>Faces Servlet</servlet-name>  
    </filter-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>
 <filter>

FileUploadController.java

import java.io.Serializable;
import java.util.logging.Logger;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

import org.primefaces.event.FileUploadEvent;

@ManagedBean(name="fileUploadController")
@RequestScoped
public class FileUploadController implements Serializable{

	private static final long serialVersionUID = 1L;
	private static final int BUFFER_SIZE = 6124;

	  private Logger logger = Logger.getLogger(FileUploadController.class.getName());  
	  
    /** Creates a new instance of UploadBean */
    public FileUploadController() {
    
    }

    public void handleFileUpload(FileUploadEvent event){
    	
    	System.out.println("Deu certo");
    }    
    
}

Codigo.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:p="http://primefaces.org/ui">
	<h:head>
	</h:head>

	<h:body>
		
			<p:growl id="messages" showSummary="true" showDetail="true" />
			<h:form enctype="multipart/form-data">

				<p:fileUpload
					fileUploadListener="{fileUploadController.handleFileUpload}"
					mode="advanced" update="messages" sizeLimit="100000"
					allowTypes="/(\.|\/)(gif|jpe?g|png)$/" />

				<p:growl id="messages" showDetail="true" />

			</h:form>
	
	</h:body>
</ui:composition>
T

Alguém ai ?

M

MB

package br.com.projeto.beans;

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Arquivos implements Serializable{

	private static final long serialVersionUID = 1L;
	
	@Id
	@GeneratedValue
	private Integer id;
	private String nome;
	private String caminho;
	private String tipo;
	private float tamanho;

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getCaminho() {
		return caminho;
	}

	public void setCaminho(String caminho) {
		this.caminho = caminho;
	}

	public String getTipo() {
		return tipo;
	}

	public void setTipo(String tipo) {
		this.tipo = tipo;
	}

	public float getTamanho() {
		return tamanho;
	}

	public void setTamanho(float tamanho) {
		this.tamanho = tamanho;
	}

}

xhtml

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!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:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:p="http://primefaces.prime.com.tr/ui">
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<title>Arquivos</title>
</h:head>
<h:body>
	<h:form enctype="multipart/form-data" update=":form:display">
		
		<div align="center">
			<p:panel header="Arquivos" style="width:1050px">
				<ui:include src="/paginas/Menu.xhtml" />
				<p:messages id="mensagens" showSummary="true" />
				
				<p:fileUpload
					fileUploadListener="#{arquivosBean.fileUploadAction}"
					update="mensagens" multiple="true"  />					
				<br />
				´
				
				
				<p:dataTable var="arquivos" value="#{arquivosBean.listArquivos}"
				widgetVar="arquivosTable"
				emptyMessage="Nenhum arquivos Encontrado Nessas Condições" rowStyleClass="#{empty rowIx or rowIx
 mod 2 ne 0 ? 'even-row' : 'odd-row'}"
 rowIndexVar="rowIx" id="display" >

				<f:facet name="header">
					<p:outputPanel>
						<h:outputText value="Procurar em todos os campos:" />
						<p:inputText id="globalFilter" onkeyup="arquivosTable.filter()"	/>
					</p:outputPanel>
				</f:facet>

				<p:column filterBy="#{arquivos.id}" headerText="Id" footerText="Id"
					filterMatchMode="contains" style="width: 40px">
					<h:outputText value="#{arquivos.id}" style="width: 40px" />
				</p:column>

				<p:column filterBy="#{arquivos.nome}" headerText="Descrição"
					footerText="Descrição" filterMatchMode="contains">
					<h:outputText value="#{arquivos.nome}" />
				</p:column>
				
				<p:column filterBy="#{arquivos.tipo}" headerText="Tipo"
					footerText="Tipo" filterMatchMode="contains" style="width: 40px">
					<h:outputText value="#{arquivos.tipo}" style="width: 40px"/>
				</p:column>
				
				<p:column filterBy="#{arquivos.tamanho}" headerText="Tamanho"
					footerText="Tamanho" filterMatchMode="contains" style="width: 140px">
					<h:outputText value="#{arquivos.tamanho}" style="width: 140px"/>
				</p:column>

				

				<p:column style="width:100px">
					<h:panelGrid columns="2" styleClass="actions" cellpadding="2">

						<h:commandButton image="/imagens/icones/download.gif" title="Download">
						<f:setPropertyActionListener value="#{arquivos.id}"
								target="#{arquivosBean.arquivo.id}" />
                        <p:fileDownload value="#{arquivosBean.file}" />  
                    </h:commandButton>  
						
						<h:commandButton image="/imagens/icones/excluir.gif" title="Excluir" action="#{arquivosBean.remove}" >
							<f:setPropertyActionListener value="#{arquivos.id}"
								target="#{arquivosBean.arquivo.id}"/>
						</h:commandButton>
					</h:panelGrid>
				</p:column>
			</p:dataTable>
				
				
				<style>
.ui-datatable .ui-datatable-data .even-row td {
     background-color:#fcefa1;
     border-right: solid 0px #4e6769; 
 }

 .ui-datatable .ui-datatable-data .odd-row td { 
     background-color:#f7f7f7;
     border-right: solid 0px #4e6769; 
 }
</style>
			</p:panel>
		</div>
	</h:form>
</h:body>
</html>

web.xml

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

Tyago, mim passar seu email que vou te encaminhar um exemplo pra te!

L

Tai, eu coloquei no despofile o exemplo

aqui está o link…

http://depositfiles.com/files/tcqy146zq

A

Alguem aqui desse tópico conseguiu usar o tal fileUpload ???

T

Eu consegui, mas possi te passar soh amanha de manha. E funciona sim. Só noa consigo fazer funcionar quando eu estou mexendo no portal liferay usando o jboss, nao sei o que acontece quando esta assim. (no portlet).

A

Boa noite amigo,

Então estou tentando usar EJB e Glassfish, mas acredito que a forma q está fazendo não dever ter muitas mudanças.

vlw pela resposta.

M

carra segue meu exemplo que coloquei ali… o meu ta funcionando perfeitamente

T

Realmente, nem vou lhe mandar o meu exemplo, pois o dele esta identico ao meu, e esta funcionando sim.

:wink:

A

Eu dei uma olhada no Exemplo, e estou fazendo desse forma.

DAO

package negocio.entidade;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;

@Entity
@Table(name = "anexo")
@NamedQueries({
    @NamedQuery(name = "Anexo.findAll", query = "SELECT a FROM Anexo a"),
    @NamedQuery(name = "Anexo.findByAnexoId", query = "SELECT a FROM Anexo a WHERE a.anexoId = :anexoId")})
public class Anexo implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Column(name = "anexo_id", nullable = false)
    private Integer anexoId;
    @Lob
    @Column(name = "anexo")
    private byte[] anexo;

    public Anexo() {
    }

    public Anexo(Integer anexoId) {
        this.anexoId = anexoId;
    }

    public Integer getAnexoId() {
        return anexoId;
    }

    public void setAnexoId(Integer anexoId) {
        this.anexoId = anexoId;
    }

    public byte[] getAnexo() {
        return anexo;
    }

    public void setAnexo(byte[] anexo) {
        this.anexo = anexo;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (anexoId != null ? anexoId.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Anexo)) {
            return false;
        }
        Anexo other = (Anexo) object;
        if ((this.anexoId == null && other.anexoId != null) || (this.anexoId != null && !this.anexoId.equals(other.anexoId))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "negocio.entidade.Anexo[ anexoId=" + anexoId + " ]";
    }
    
}

Ae que vem minha dúvida , quero jogar para minha tabela ou gravar em uma pasta.
Estou seguindo esse exemplo.

MB

package apresentacao.managedbean;

import java.io.Serializable;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.servlet.ServletException;
import negocio.entidade.Anexo;
import org.primefaces.event.FileUploadEvent;

@ManagedBean(name = "anexoMB")
@SessionScoped
public class AnexoMB implements Serializable {

    private EntityManagerFactory factory;
    private byte[] anexo;

    public void handleFileUpload(FileUploadEvent event) throws ServletException {

        FacesMessage msg = new FacesMessage("Succesful", event.getFile().getFileName() + " is uploaded.");
        FacesContext.getCurrentInstance().addMessage(null, msg);
        byte[] foto = event.getFile().getContents();
        Anexo imagem = new Anexo();
        imagem.setAnexo(anexo);

        this.factory = Persistence.createEntityManagerFactory(null);

        EntityManager entityManager = this.factory.createEntityManager();
        entityManager.getTransaction().begin();
        
        try {
            entityManager.getTransaction().commit();
        } catch (Exception e) {
            entityManager.getTransaction().rollback();
            throw new ServletException(e);
        } finally {
            entityManager.close();
        }
    }
}

XHML

&lt;h:form id="UpImagem" enctype="multipart/form-data"&gt;  
         &lt;p:messages showDetail="true"/&gt;  
         &lt;p:fileUpload id="upload" update="foto" fileUploadListener="#{AnexoMB.handleFileUpload}" auto="true"/&gt;   
&lt;/h:form&gt;

WEB.XML

&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;
L

ver o exemplo que fiz só baixar

http://depositfiles.com/files/tcqy146zq

F

Eaeeeee pessoallll!!!
Nossa tive problema com esse negócio ai… fiquei semanas para conseguir resolver…
desisti…e qdo resolvi voltar resolvi em algumas horas… acho que foi pq refresquei a cabeça e soube pesquisar melhor!
Vamos la!!! vou postar as configurações e vocês tentam ai!!

Primeiro eu estou utilizando a versão 3.0 do Primefaces, mas acho que a 3.0.1 e a 3.1 funcionam normalmente!

Vamos configurar o web.xml

Adicionem o seguinte código.

<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>

Depois vocês precisam utilizar as bibliotecas

commons.fileupload-1.2.2.jar
site: http://commons.apache.org/fileupload/download_fileupload.cgi

commons.io-2.1.jar
site: http://commons.apache.org/io/download_io.cgi

Em seguida aqui está o código que eu uso na minha página XHTML, no meu caso eu só estou utilizando arquivos “PDF” e “DOC”, chamando o método carregaArquivo na minha classe EmpresaBean.

<h:panelGroup>
	<p:fileUpload fileUploadListener="#{empresaBean.carregaArquivo}"  
		mode="advanced"   
		update="messages"  
		sizeLimit="100000"   
		allowTypes="/(\.|\/)(doc|pdf)$/" id="arquivo">
		<p:growl id="messages" showDetail="true"/> 
	</p:fileUpload>
		
</h:panelGroup>

Agora a minha classe Bean.

public void carregaArquivo(FileUploadEvent event) throws IOException {
	this.arquivo = event.getFile();

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

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

	ctx.addMessage("mensagens", msg);
}

Boa sorte pessoal!
Espero que ajudem vocês.

J

Meu Deus …
Mas precisa esse caminhão de jar (s) ???

To falando desse exemplo aqui : http://depositfiles.com/files/tcqy146zq

funciona, mas tem um caminhão de lib …

F

joaoorso:
Meu Deus …
Mas precisa esse caminhão de jar (s) ???

São Apenas 2 jars.

J

Furlani:
joaoorso:
Meu Deus …
Mas precisa esse caminhão de jar (s) ???

São Apenas 2 jars.

Desculpe, to falando do exemplo que tá no depositfiles…
O exemplo funcionou aqui pra mim.

E

Alguem poderia postar o projeto para download de um exemplo que esteja funcionando ? Já tentei de tudo e to começando agora na empresa ;/ Obrigado desde já

M

Cara eu fiz um exemplo com o p:fileUpload no meu blog http://miguellimapj.blogspot.com.br/

E

Obrigado pela dica, mas… handleFileUpload não é chamado, quando paro com o cursor em cima dele diz o seguinte: Propriedade handleFileUpload desconhecida.

tem idéia do que pode ser ?

=======

Achei aqui, quando você usa handleFileUpload(event) ele não aparece a mensagem que a propriedade é desconhecida, mas também não funciona, porem sem o event (handleFileUpload) fica a mensagem, mas funciona.

Obrigado pelas dicas, funcionou direitinho;

Agradecido!

Criado 1 de abril de 2011
Ultima resposta 26 de nov. de 2012
Respostas 28
Participantes 11