Problema com FileUpload do Primefaces

3 respostas
M

Olá, eu vi que esse é um problema que muita gente tem, já procurei bastante nos foruns e não consegui de jeito nenhum fazer funcionar o FileUpload do Primefaces.

SERVIDOR: GLASSFISH 4.0

O que eu importei na Libraries:
primefaces-3.5
commons-fileupload-1.3.jar
commons-io-2.4

Estava tentando implementar o FileUpload numa aplicação já pronta e como não estava conseguindo, resolvi criar um projeto teste do zero, mais simples possível para testar o FileUpload e mesmo assim o negócio não funciona.

Segue o xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</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>/faces/*</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>faces/index.xhtml</welcome-file>
    </welcome-file-list>
    
    <filter>
        <filter-name>primeUploadFilter</filter-name>
        <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>primeUploadFilter</filter-name>
        <servlet-name>Faces Servlet</servlet-name>
    </filter-mapping>
</web-app>

o index.xhtml

<?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:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui">
    <h:head>
        <title>teste</title>
    </h:head>
    <h:body>
        <h:form enctype="multipart/form-data">  
           <p:fileUpload fileUploadListener="#{fileUploadMB.doUpload}" mode="advanced" dragDropSupport="false" update="messages" sizeLimit="100000" allowTypes="/(\.|\/)(txt)$/" />             

            <h:panelGrid columns="4" cellpadding="5">  
                <h:outputLabel for="name" value="Name:" style="font-weight:bold"/>            
                <p:inputText id="name" value="#{fileUploadMB.firstname}" />            
                <p:commandButton value="Submit" update="display,messages"/>    
                <h:outputText value="#{fileUploadMB.firstname}" id="display" />  
                 <p:growl id="messages" showDetail="true"/>
            </h:panelGrid>  

        </h:form>  
    </h:body>
</html>

e o bean:

package bean;

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 org.primefaces.event.FileUploadEvent;
import org.primefaces.model.UploadedFile;

/**
 *
 * @author eu
 */
@SessionScoped
@ManagedBean
public class FileUploadMB implements Serializable {    

    private String firstname;  

    public String getFirstname() {
        System.out.println("Chegou GETFIRSTNAME..................................");
        FacesContext facesContext = FacesContext.getCurrentInstance();
        facesContext.addMessage(null, new FacesMessage("firstname = ", firstname));
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }
    
    public void doUpload(FileUploadEvent fileUploadEvent) { 
        System.out.println("Chegou aqui..................................");
             UploadedFile uploadedFile = fileUploadEvent.getFile();  
             String fileNameUploaded = uploadedFile.getFileName(); 
             long fileSizeUploaded = uploadedFile.getSize(); 
             String infoAboutFile = "<br/> Arquivo recebido: <b>" +fileNameUploaded +"</b><br/>" + "Tamanho do Arquivo: <b>"+fileSizeUploaded+"</b>";
             FacesContext facesContext = FacesContext.getCurrentInstance();
             facesContext.addMessage(null, new FacesMessage("Sucesso", infoAboutFile));
   }
}

Como é um teste, queria ver se o bean está funcionando direitinho, por isso tem o panelGrid para exibir o que o usuario digita no input, este está sendo exibido corretamente.

Porém no método doUpload que recebe como parâmetro o FileUploadEvent coloquei na primeira linha um simples println para saber que chegou naquela linha, mas nada sai no log do servidor. Já no caso do método getFirstname() a saída "Chegou GETFIRSTNAME.................................." é mostrada no log corretamente.....

Portanto creio que a falha está no FileUploadEvent mas sei mais o que fazer.

Quem puder me ajudar eu agradeço!!

3 Respostas

R

Eu uso assim:

<h:form enctype="multipart/form-data" prependId="false" id="formColunas" >

            <p:messages showDetail="true"/>

            <p:fileUpload id="arquivo" value="#{fileUploadController.file}" 
                          style="width: 300px" 
                          allowTypes="/(\.|\/)(xls|xlsx|ods)$/"
                          invalidFileMessage="Tipos permitidos: xls, xlsx, ods."
                          mode="advanced" 
                          update="traducao btnSalvar" auto="true" 
                          label="Escolher planilha (xls, xlsx, ods) ..." 
                          fileUploadListener="#{fileUploadController.carregouArquivo}"  />

E no bean:

public void carregouArquivo(FileUploadEvent event) {
        file = event.getFile();

E no 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>2097152</param-value>
        </init-param>
    </filter>  
    <filter-mapping>
        <filter-name>PrimeFaces FileUpload Filter</filter-name>
        <servlet-name>Faces Servlet</servlet-name>
    </filter-mapping>
M

Roselito Fávero da Silva:
Eu uso assim:

<h:form enctype="multipart/form-data" prependId="false" id="formColunas" >

            <p:messages showDetail="true"/>

            <p:fileUpload id="arquivo" value="#{fileUploadController.file}" 
                          style="width: 300px" 
                          allowTypes="/(\.|\/)(xls|xlsx|ods)$/"
                          invalidFileMessage="Tipos permitidos: xls, xlsx, ods."
                          mode="advanced" 
                          update="traducao btnSalvar" auto="true" 
                          label="Escolher planilha (xls, xlsx, ods) ..." 
                          fileUploadListener="#{fileUploadController.carregouArquivo}"  />

E no bean:

public void carregouArquivo(FileUploadEvent event) {
        file = event.getFile();

E no 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>2097152</param-value>
        </init-param>
    </filter>  
    <filter-mapping>
        <filter-name>PrimeFaces FileUpload Filter</filter-name>
        <servlet-name>Faces Servlet</servlet-name>
    </filter-mapping>

Roselito testei o seu código e também fica da mesma forma que os outros códigos que eu testei.

Aparece o botão, eu clico , seleciono o arquivo e depois nada acontece. Portanto acho mesmo que o problema não está nos no código mas em alguma biblioteca ou algo relacionado ao glassfish.

Li que preciso dos dois arquivos commons-fileupload e commons-io, atualmente estou testando com as versões 1.3 do fileupload e 2.4 do io , juntamente com o primefaces 3.5 (versão que terei que usar).

Mais alguma sugestão?

Obrigado!

M

mnemoniac eu fiz este tuto sobre upar os arquivos para o servidor, mas eu não usei o PrimeFaces e o arquivo está sendo gravado no banco de dados, modificando a parte do upload você conseguirá subir para o HD em vez do BD.

http://www.guj.com.br/java/304872-tutorial-upload-e-download-com-o-jsf

Criado 1 de novembro de 2013
Ultima resposta 4 de nov. de 2013
Respostas 3
Participantes 3