FileUpload Prime Faces

27 respostas
A

Pessoal, o javaScript do meu fileUpload não funciona nem com reza... segui o exemplo feito em:

http://quebrandoparadigmas.wordpress.com/category/netbeans-6-9/

onde a intenção é somente exibir num outText o nome do arquivo que acabou de ser selecionado, porém ele não faz a renderização e muito menos coloca o valor no Bean.

meu Managed Bean é esse:

package controllers;

import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

/**

  */
@ManagedBean
@SessionScoped
public class FileUploadController {

    private String nomeArquivoSelecionado;
    private StreamedContent imagem;

    public StreamedContent getImagem() {
        return imagem;
    }

    public void setImagem(StreamedContent imagem) {
        this.imagem = imagem;
    }

    public String getNomeArquivoSelecionado() {
        return nomeArquivoSelecionado;
    }

    public void setNomeArquivoSelecionado(String nomeArquivoSelecionado) {
        this.nomeArquivoSelecionado = nomeArquivoSelecionado;
    }

    public void fileUploadAction(FileUploadEvent event) {
       
    	System.out.print("Testeeee");
    	try {
            setNomeArquivoSelecionado(event.getFile().getFileName());
            imagem = new DefaultStreamedContent(event.getFile().getInputstream());
        } catch (IOException ex) {
            Logger.getLogger(FileUploadController.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

minha página JSF:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE composition 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:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.prime.com.tr/ui">

    <h:head>

         <title>Upload de Arquivos com primefaces</title>

    </h:head>

    <h:body>

        <h:form>

            <p:fileUpload auto="false" label="Selecionar..." allowTypes="*.gif,*.png,*.jpg" multiple="false" description="Imagem" fileUploadListener="#{fileUploadController.fileUploadAction}" update="idarquivo" />

            Arquivo selecionado: <h:outputText id="idarquivo" value="#{fileUploadController.nomeArquivoSelecionado}"/>
                         

        </h:form>

    </h:body>

</html>

ele nem chega a mostrar no Console o "Testee". no meu Web.xml ja coloquei o filtro do Prime como descrito no artigo.

estou usando o PrimeFaces 2.0.2 SNAPSHOT.jar com Eclipse

alguém sabe pq isso ocorre?

27 Respostas

J

Olá, isso é estranho… Porque você acha que o problema é JavaScript? Na verdade é em flash. Veja se você colocou o filtro direito, porque pelo que você disse o método nem está sendo executado…

Veja se a definição do seu filtro está como abaixo:

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

Obs: Você adicionou os arquivos commons-fileupload.jar e commons-io.jar no seu classpath?

O exemplo aqui do blog http://quebrandoparadigmas.wordpress.com/ tá completinho…funcionou beleza.

A

caraaa… tá td como no exemplo lá! e não funcionou!

vc tem um projeto com apenas essa página funcionando??

tinha como disponibilizar?? pq não tenho mais onde recorrer tendo em vista que esta td como citado no artigo e até o exemplo do PrimeFaces.

J

Eu fiz o projeto usando o netbeans, empacotei e coloquei pra download. Tá no final do post. Espero que agora dê certo.

Mais uma coisa Aécio, se em sua página qualquer outro componente estiver dando problemas de javascript o fileuploado não vai funcionar. Então certifique-se de que não exista um outro componente com problemas de javascript ou qualquer outra coisa.

att,

Wagner Borges.

A

não achei o download!!

J

Bom, tá no final do post. Mas vai aí o link direto

att,

Wagner Borges.

A

vlw!! vou testar!!

A

cara… tentei fazer aqui o deploy…

acontece que na página onde tem o UpLoad só aparece o texto… Arquivo selecionado:

não aparace os componentes JSF, sabe o que pode ser isso?? os jars já esão no classPath do Aplicativo. tentei tbm com o fonte pelo netBeans mas acontece a mesma coisa!!

G

pessoal eu to tentando usar esse componente aqui tbm tá dando problema eu baixei os jars td certinho alterei meu web.xml como manda o figurino. só que não funciona nem na bala.
Eu estou usando o tomcat 7, tem alguma coisa a ver? esse componente só funciona no glassfish3?
Abraço.

V

de uma olhada aqui http://quebrandoparadigmas.wordpress.com/2010/07/06/file-upload-com-primefaces-e-jsf2

colocou as libs commons-fileupload1.1 e commons-io.jar ?

R

Eu passei pela mesma experiência e foi TRASH até descobrir oq era.

A solução para o meu problema foi colocar entre as tags a tag <p:resources />

e lá no web.xml adicionar os filtros abaixo

<servlet>
      <servlet-name>Resource Servlet</servlet-name>
      <servlet-class>org.primefaces.resource.ResourceServlet</servlet-class>
</servlet>   
   
<servlet-mapping>
      <servlet-name>Resource Servlet</servlet-name>
      <url-pattern>/primefaces_resource/*</url-pattern>
</servlet-mapping>

Testa ae para ver se funciona.

Eu também segui este exemplo e não consegui fazer o <p:graphicImage> carregar a imagem que acabou de ser uploadeada (PQP !!! ficou feio hein)

Ricardo

D
tb estou com o mesmo problema, estou seguindo o mesmo blog,o meu web.xml tb esta com
<servlet>   
      <servlet-name>Resource Servlet</servlet-name>   
      <servlet-class>org.primefaces.resource.ResourceServlet</servlet-class>   
</servlet>     
     
<servlet-mapping>   
      <servlet-name>Resource Servlet</servlet-name>   
      <url-pattern>/primefaces_resource/*</url-pattern>   
</servlet-mapping>
e tb nao funciona comecei a depurar para ver o js e esta dando erro de javascript

'YAHOO' não está definido cookie-min.js.xhtml?ln=primefaces, linha 7 Caractere 1.

se alguem ai ja conseguiu resolver o problema, por favor posta ai a solucao

R

Eu também segui esse tutorial e deu QUASE certo.
Eu consigo fazer o upload, mas não atualiza a tag <p:graphicImage>.

Parece que o atributo UPDATE do FILEUPLOAD não funciona.
Minha aplicação está praticamente igual ao exemplo do tutorial. A única diferença é que estou usando a versão 1.1 do Primefaces.

Alguém já passou por esta situação ??

Ricardo

D

cara eu acho q é problema de versao estava usando a versao do primefaces-2.2.M1 acho q é a versao de teste e estava dando erro de java script faltando alguma biblioteca para ser exato estava com esse problema aqui "‘YAHOO’ is not defined cookie-min.js.xhtml?ln=primefaces, line 7 character 1. " fiz um “downgrade” para primefaces-2.1 e funcionou ate um certo ponto pos o erro que esta dando é nao tem a ver com javascript e sim com “java.util.zip.ZipException: incomplete literal/length tree” tem ideia do q seja ?

C

Pessoal, em que lugar eu seto o local para onde o arquivo deve ser upado ???

R

Você pode configurar o caminho no filtro dentro do web.xml

Por exemplo:

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

Ricardo

C

ricardo13:
Você pode configurar o caminho no filtro dentro do web.xml

Por exemplo:

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

Ricardo

Do modo que eu estou fazendo, o componente esta assim:

<p:fileUpload id="idFileUpload"
                            auto="true"
                          label="Procurar..."
                          allowTypes="*.avi,*.mpeg,*.webm,*.wmv,*.mp3,*.flv"
                          multiple="false"

                          fileUploadListener="#{fileUploadController.fileUploadAction}"
                          update="idMeuForm"  />

o componente chama o metodo fileUploadAction

public void fileUploadAction(FileUploadEvent event) throws IOException {
System.out.println("----> fileUploadAction(FileUploadEvent event)");
    System.out.println("---->fileUploadAction(FileUploadEvent event)");
    nomeArquivoSelecionado = event.getFile().getFileName();

    System.out.println("----> nome do arquivo selecionado: " + nomeArquivoSelecionado);

    byte[] conteudo = event.getFile().getContents();

    String caminho = "C:\\apache-tomcat-6.0.28\\webapps\\ROOT\\" + event.getFile().getFileName();
    FileOutputStream fos = new FileOutputStream(caminho);
    fos.write(conteudo);
    fos.close();


    this.dcPanel = true;
    System.out.println("---->var dcPanel setada para: " + this.dcPanel);
}

ou seja, em um momento eu seto o caminho que o sistema deve mandar o arquivo:

String caminho = "C:\\apache-tomcat-6.0.28\\webapps\\ROOT\\" + event.getFile().getFileName(); FileOutputStream fos = new FileOutputStream(caminho);

…se eu usar esse modo de setar o caminho no web.xml como o ricardo disse, como fica meu metodo?

o componente <p:fileUpload> nem precisaria de um fileUploadListener ?? ele enviaria automaticamente o arquivo para o local especificado no xml ???

R

Eu acho que não, mas você pode colocar um log ou qualquer outra coisa.

Envia.

Ricardo

E

Pessoa estou com um problema similar, desculpa de de postar isto aqui mais não sei mais aonde recorrer

meu problema

E

Ajuda?

T

Respondi lá, vê se te ajuda em algo, erickfm8.

E

Okey, Obrigado,vamos pra la então que os problemas continuan,quem puder dar uma olhada la no post…

Valew galera

L

Olá meninos,

há um artigo que talvez possa ajudá-los!

http://www.patternizando.com.br/2011/04/upload-com-primefaces/

[]s

C

Algum de vocês que estava com esse problema conseguiu a solução amigos?

To com o mesmo problema e ta dificil descobrir oq é

S

Boa noite pessoal,

Hoje perdi umas 6 horas tentando resolver o problema de fazer upload de um arquivo e gravar no banco de dados MySQL. Abaixo segue a solução que encontrei, juntando um quebra cabeça de dicas de vários sites.

No arquivo web.xml :

javax.faces.STATE_SAVING_METHOD server
<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>

A pagina com o fileUpload deverá conter o seguinte código :

<h:form enctype=“multipart/form-data”>

<p:fileUpload value="#{controlePergunta.arquivo}" 
                        mode="simple" 
                        fileUploadListener="#{controlePergunta.uploadArquivo}" 
                        label="#{msg.pfstiperguntaimgblobprocurar}"/>

</h:form>

No controle deverá exsitir os seguintes métodos :

public void uploadArquivo(FileUploadEvent event){
	try {
		StreamedContent imagem;
		imagem = new DefaultStreamedContent(event.getFile().getInputstream());   
		byte[] buffer = new byte[(int) event.getFile().getSize()];
		int bulk;
		while (true) {
			bulk = imagem.getStream().read(buffer);
			if (bulk < 0) {
				break;
			}
		}
		SerialBlob arq = new SerialBlob(buffer);
		getPergunta().setImg_blob(arq);

	} catch (IOException e) {
	   UtilSTI.mensagemSEVERITY_ERROR(new STIException(EnumErroException.ERROENTRADASAIDAUPLOAD, null));
	} catch (SerialException e) {
		   UtilSTI.mensagemSEVERITY_ERROR(new STIException(EnumErroException.ERROGRAVARARQUIVOBANCO, null));
	} catch (SQLException e) {
		   UtilSTI.mensagemSEVERITY_ERROR(new STIException(EnumErroException.ERROCREATE, e.getStackTrace()));
	}
}

public UploadedFile getArquivo() {
	return arquivo;
}

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

Na classe DAO gravamos o campo normalmente

stm.setString(1, entidade.getNm_assunto());

stm.setString(2, entidade.getDs_pergunta());

stm.setInt(3, entidade.getCodigoCategoria());

stm.setBlob(4, entidade.getImg_blob());

Na tabela do MySQL o tipo do campo onde será gravado o arquivo deve ser BLOB, senão ocorrerá erro.

Field, Type

‘img_blob’ ‘blob’

E é isso.

L

comedor_de_folhas vc precisa setar o lugar no método que vc chama no componente
FileUpload no atributo fileUploadListener, vou postar meu codigo que está funcionando
perfeitamente

Pagina onde uso o componente FileUpload

<p:fileUpload fileUploadListener="#{fileUploadController.upload}" required="true" label="Selecione os Arquivos" 	sizeLimit="500000" description="Selecione os arquivos" multiple="true" dragDropSupport="true" 
invalidSizeMessage="Tamanha maior que o permitido!" invalidFileMessage="Extensão não Permitida"
uploadLabel="Subir Arquivos" requiredMessage="Precisa de 2 Arquivos" auto="true"/>

classe de controle(Bean)

package controle;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.faces.bean.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
import org.primefaces.event.FileUploadEvent;
 
@ManagedBean(name="fileUploadController")
@SessionScoped
public class FileUploadController {
   private String destination="C://Users//Luciano.tulio//Desktop//Nova//";//aqui vc seta onde quer gravar o arquivo

    public void upload(FileUploadEvent event) {  
        FacesMessage msg = new FacesMessage("Success! ", event.getFile().getFileName() + " is uploaded.");  
        FacesContext.getCurrentInstance().addMessage(null, msg);
              
        try {
            copyFile(event.getFile().getFileName(), event.getFile().getInputstream());
        } catch (IOException e) {
            e.printStackTrace();
        }

    }  

    public void copyFile(String fileName, InputStream in) {
           try {
             
             
                // write the inputStream to a FileOutputStream
                OutputStream out = new FileOutputStream(new File(destination + fileName));
             
                int read = 0;
                byte[] bytes = new byte[1024];
             
                while ((read = in.read(bytes)) != -1) {
                    out.write(bytes, 0, read);
                }
             
                in.close();
                out.flush();
                out.close();
             
                System.out.println("New file created!");
                } catch (IOException e) {
                System.out.println(e.getMessage());
                }
    }
}

Meu xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
 <display-name>NomeDoProjeto</display-name>

 	<context-param>  
        <param-name>primefaces.THEME</param-name>  
        <param-value>dot-luv</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>
	<servlet-mapping>
	  		<servlet-name>Faces Servlet</servlet-name>
	  		<url-pattern>*.faces</url-pattern>
	 </servlet-mapping>
	<servlet-mapping>
	 		<servlet-name>Faces Servlet</servlet-name>
	  		<url-pattern>/faces/*</url-pattern>
	 </servlet-mapping>
	<session-config>
	 	<session-timeout>30</session-timeout>
	 </session-config>
	
	<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:\Users\Luciano.tulio\Desktop
            </param-value>
    </init-param>
    <init-param>
      <param-name>thresholdSize</param-name>
      <param-value>
                10000000
            </param-value>
    </init-param>
    </filter>  
    <filter-mapping>  
        <filter-name>PrimeFaces FileUpload Filter</filter-name>  
        <servlet-name>Faces Servlet</servlet-name>  
    </filter-mapping>  
</web-app>

Espero ter ajudado!!!

E

Cara, qual o tipo de variavel “in”??? copiei o seu codigo, mas faltou declarar isso .

while ((read = in.read(bytes)) != -1) {

G

Luciano Tulio,

Valeu. Sua dica me ajudou muito!

Criado 19 de julho de 2010
Ultima resposta 4 de set. de 2014
Respostas 27
Participantes 15