Componente Upload do primefaces

Estou tentando fazer um upload de um arquivo excel porém ele não está sendo reconhecido, estou seguindo o exemplo do primefaces, mas mesmo assim não está dando certo. Ele não reconhece o file no if(file != null), isso retorna null e vai direto pro else.

<?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:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:f="http://java.sun.com/jsf/core">

    <ui:composition id="composicao" template="/template.xhtml">
        <!--   <ui:define name="title">
              <h:outputText value="#{bundle.CreateAreasTitle}"> </h:outputText>
          </ui:define> -->
        <ui:define name="body">


            <f:view>
                <f:metadata>
                    <f:viewParam name="codigo" value="#{areasController.selected}" />
                </f:metadata>

                <h:outputScript name="js/locale-primefaces.js"/>
                <h:outputScript name="js/jquery.maskMoney.js"/>

                <script  type="text/javascript">
                    $(document).ready(format);
                    function format() {

                    }
                </script>

                <ui:include src="/pagina/metaBaseAtivos/Modal.xhtml">
                    <ui:param name="editar" value="true" />
                    <ui:param name="comando" value="#{areasController.selecionarMetaBaseAtivosList}"   />
                </ui:include>

                <ui:include src="/pagina/cr/Modal.xhtml">
                    <ui:param name="editar" value="true" />
                    <ui:param name="comando" value="#{areasController.selecionarCrList}"   />
                </ui:include>


                <h:form id="form">
                    <p:panel styleClass="centralizado"  header="#{bundle.CreateAreasTitle}"  style="margin-top: 10px; width: 1024px;">

                        <h:panelGrid width="100%" columns="1">
                           <h:outputLabel value="#{bundle.CreateAreasLabel_area}" for="area" />
                           <p:inputText id="area" onblur="value=value.toUpperCase()"  maxlength="255"   value="#{areasController.selected.area}" title="#{bundle.CreateAreasTitle_area}" required="true" requiredMessage="Preencha o campo #{bundle.CreateAreasTitle_area}"/>
                          
                        </h:panelGrid>
                        
                    </p:panel>
                    <p:panel styleClass="centralizado" header="#{bundle.acoes}" style="margin-top: 10px; width: 1024px;">
                        <h:panelGrid style="text-align: center" columns="3" width="100%">    
                            <p:commandButton id="botaoSalvar" icon="ui-icon-disk" action="#{areasController.create}" value="#{bundle.CreateAreasSaveLink}" ajax="false" />
                            <p:commandButton id="botaoConsultar" icon="ui-icon-search" action="#{areasController.prepareList}" value="#{bundle.CreateAreasShowAllLink}" ajax="false" immediate="true"/>
                            <p:commandButton id="botaoNovo" icon="ui-icon-document"  value="#{bundle.novo}" action="#{areasController.prepareCreate}" ajax="false" immediate="true"/>
                        </h:panelGrid>
                    </p:panel>            
                </h:form>
                
                <h:form enctype="multipart/form-data" id="uploadExcel">
                    <p:panel styleClass="centralizado" >
                        <p:growl id="messages" showDetail="true"/>

                        <p:fileUpload label="Escolher" value="#{areasController.file}" mode="simple" skinSimple="true" />

                        <p:commandButton value="Enviar" ajax="false" actionListener="#{areasController.upload}" process="@this, form:uploadExcel"/>
                    </p:panel>  
                </h:form>

            </f:view>
        </ui:define>
    </ui:composition>

</html>

Apenas a parte que faz referencia ao upload do controller:

public UploadedFile getFile() {
    return file;
}

public void setFile(UploadedFile file) {
    this.file = file;
}

public void upload() throws IOException, BiffException{
    Areas area = new Areas();
    if(file != null) {
        /* pega o arquiivo do Excel */
        Workbook workbook = Workbook.getWorkbook(new File(getFile().getFileName()));
        
        /* pega a primeira planilha dentro do arquivo XLS */
        Sheet sheet = workbook.getSheet(0); 
        
        //Pega a quantidade de linhas da planilha
        int linhas = sheet.getRows();
        
        for (int i = 0; i < linhas; i++) {
         /* pega os valores das células como se numa matriz */
            Cell a1 = sheet.getCell(0,i);
            /* pega os conteúdos das células */
            area.setArea(a1.getContents());
            getFacade().create(area);
        }
        
        FacesMessage message = new FacesMessage("Succesful", file.getFileName() + " is uploaded.");
        FacesContext.getCurrentInstance().addMessage(null, message);
     } else {
        FacesMessage message = new FacesMessage("Nao encontrado");
        FacesContext.getCurrentInstance().addMessage(null, message);
    }
        
}

Você já configurou o web.xml para reconhecer o fileUpload o primefaces?

Qualquer dúvida dê uma olhada neste link:

Seria apenas adicionar isso ao web.xml? Pois fiz isso e não mudou nada.

<context-param>
      <param-name>primefaces.UPLOADER</param-name>
      <param-value>auto|native|commons</param-value>
    </context-param>
    
    <filter>
        <filter-name>FileUploadFilter</filter-name>
        <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
   </filter>

    <filter-mapping>
        <filter-name>FileUploadFilter</filter-name>
        <servlet-name>FacesServlet</servlet-name>
    </filter-mapping>

no trecho do primefaces.UPLOADER você escolheu que opção?

tente assim:

@this, uploadExcel

Eu deixei as duas, achei que por ser tags diferentes ele faria a seleção correta.

Para ele escolher a melhor opção para você é só deixar auto.

<context-param>
      <param-name>primefaces.UPLOADER</param-name>
      <param-value>auto|native|commons</param-value>
    </context-param>
    
    <filter>
        <filter-name>FileUploadFilter</filter-name>
        <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
   </filter>

    <filter-mapping>
        <filter-name>FileUploadFilter</filter-name>
        <servlet-name>FacesServlet</servlet-name>
    </filter-mapping>

Assim?

Você deixa a opção auto, desta maneira ele verifica a melhor opção da biblioteca para você

primefaces.UPLOADER
auto

Assim o primefaces reconhecerá o seu fileupload.

@java_Gustavo Desculpe, não estava entendendo. Fiz a configuração como disse e coloquei a opção auto, porém mesmo assim estou recebendo um erro quando vou iniciar o servidor.

Erro:

 Grave:   WebModule[/SGT-SGI]Exception starting filter FileUploadFilter
java.lang.InstantiationException
	at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:127)
	at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4980)
	at org.apache.catalina.core.StandardContext.start(StandardContext.java:5623)
	at com.sun.enterprise.web.WebModule.start(WebModule.java:540)
	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:917)
	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:900)
	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:684)
	at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:2044)
	at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:1690)
	at com.sun.enterprise.web.WebApplication.start(WebApplication.java:107)
	at org.glassfish.internal.data.EngineRef.start(EngineRef.java:122)
	at org.glassfish.internal.data.ModuleInfo.start(ModuleInfo.java:291)
	at org.glassfish.internal.data.ApplicationInfo.start(ApplicationInfo.java:352)
	at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:500)
	at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:219)
	at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:491)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:540)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:536)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.Subject.doAs(Subject.java:360)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$2.execute(CommandRunnerImpl.java:535)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$3.run(CommandRunnerImpl.java:566)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$3.run(CommandRunnerImpl.java:558)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.Subject.doAs(Subject.java:360)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:557)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1465)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1300(CommandRunnerImpl.java:110)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1847)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1723)
	at org.glassfish.deployment.admin.ReDeployCommand.execute(ReDeployCommand.java:131)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:540)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:536)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.Subject.doAs(Subject.java:360)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$2.execute(CommandRunnerImpl.java:535)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$3.run(CommandRunnerImpl.java:566)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$3.run(CommandRunnerImpl.java:558)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.Subject.doAs(Subject.java:360)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:557)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1465)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1300(CommandRunnerImpl.java:110)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1847)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1723)
	at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:534)
	at com.sun.enterprise.v3.admin.AdminAdapter.onMissingResource(AdminAdapter.java:224)
	at org.glassfish.grizzly.http.server.StaticHttpHandlerBase.service(StaticHttpHandlerBase.java:190)
	at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:463)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:168)
	at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:206)
	at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:180)
	at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:242)
	at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
	at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284)
	at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201)
	at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133)
	at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
	at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
	at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:539)
	at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
	at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
	at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56)
	at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
	at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:593)
	at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:573)
	at java.lang.Thread.run(Thread.java:748)
Caused by: com.sun.enterprise.container.common.spi.util.InjectionException: Error creating managed object for class: class org.primefaces.webapp.filter.FileUploadFilter
	at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl.createManagedObject(InjectionManagerImpl.java:352)
	at com.sun.enterprise.web.WebContainer.createFilterInstance(WebContainer.java:765)
	at com.sun.enterprise.web.WebModule.createFilterInstance(WebModule.java:1992)
	at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:256)
	at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:123)
	... 66 more
Caused by: org.jboss.weld.resources.spi.ResourceLoadingException: Error while loading class org.primefaces.webapp.filter.FileUploadFilter
	at org.jboss.weld.resources.ClassTransformer.getBackedAnnotatedType(ClassTransformer.java:183)
	at org.jboss.weld.resources.ClassTransformer.getBackedAnnotatedType(ClassTransformer.java:191)
	at org.jboss.weld.manager.BeanManagerImpl.createAnnotatedType(BeanManagerImpl.java:1118)
	at org.glassfish.weld.services.JCDIServiceImpl.createManagedObject(JCDIServiceImpl.java:447)
	at org.glassfish.weld.services.JCDIServiceImpl.createManagedObject(JCDIServiceImpl.java:317)
	at com.sun.enterprise.container.common.impl.managedbean.ManagedBeanManagerImpl.createManagedBean(ManagedBeanManagerImpl.java:477)
	at com.sun.enterprise.container.common.impl.managedbean.ManagedBeanManagerImpl.createManagedBean(ManagedBeanManagerImpl.java:430)
	at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl.createManagedObject(InjectionManagerImpl.java:336)
	... 70 more
Caused by: java.lang.NoClassDefFoundError: org/apache/commons/fileupload/FileItemFactory
	at java.lang.Class.getDeclaredConstructors0(Native Method)
	at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671)
	at java.lang.Class.getDeclaredConstructors(Class.java:2020)
	at org.jboss.weld.annotated.slim.backed.SecurityActions.getDeclaredConstructors(SecurityActions.java:57)
	at org.jboss.weld.annotated.slim.backed.BackedAnnotatedType$BackedAnnotatedConstructors.computeValue(BackedAnnotatedType.java:166)
	at org.jboss.weld.annotated.slim.backed.BackedAnnotatedType$BackedAnnotatedConstructors.computeValue(BackedAnnotatedType.java:163)
	at org.jboss.weld.util.LazyValueHolder.get(LazyValueHolder.java:46)
	at org.jboss.weld.annotated.slim.backed.BackedAnnotatedType$EagerlyInitializedLazyValueHolder.<init>(BackedAnnotatedType.java:159)
	at org.jboss.weld.annotated.slim.backed.BackedAnnotatedType$BackedAnnotatedConstructors.<init>(BackedAnnotatedType.java:163)
	at org.jboss.weld.annotated.slim.backed.BackedAnnotatedType$BackedAnnotatedConstructors.<init>(BackedAnnotatedType.java:163)
	at org.jboss.weld.annotated.slim.backed.BackedAnnotatedType.<init>(BackedAnnotatedType.java:64)
	at org.jboss.weld.annotated.slim.backed.BackedAnnotatedType.of(BackedAnnotatedType.java:47)
	at org.jboss.weld.resources.ClassTransformer$TransformClassToBackedAnnotatedType.apply(ClassTransformer.java:81)
	at org.jboss.weld.resources.ClassTransformer$TransformClassToBackedAnnotatedType.apply(ClassTransformer.java:76)
	at org.jboss.weld.util.cache.ReentrantMapBackedComputingCache.lambda$null$0(ReentrantMapBackedComputingCache.java:55)
	at org.jboss.weld.util.WeakLazyValueHolder$1.computeValue(WeakLazyValueHolder.java:35)
	at org.jboss.weld.util.WeakLazyValueHolder.get(WeakLazyValueHolder.java:53)
	at org.jboss.weld.util.cache.ReentrantMapBackedComputingCache.getValue(ReentrantMapBackedComputingCache.java:72)
	at org.jboss.weld.util.cache.ReentrantMapBackedComputingCache.getCastValue(ReentrantMapBackedComputingCache.java:78)
	at org.jboss.weld.resources.ClassTransformer.getBackedAnnotatedType(ClassTransformer.java:174)
	... 77 more
Caused by: java.lang.ClassNotFoundException: org.apache.commons.fileupload.FileItemFactory
	at org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1621)
	at org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1471)
	... 97 more

Você além de importar a biblioteca do primefaces, você tem que colocar no seu projeto as bibliotecas:
commons-fileupload-1.2.1.jar
commons-io-1.4.jar
Pois um dos erros que ele coloca é que não consegue encontrar a classe.

1 curtida

Sim, eu consegui identificar isso em outro tópico, mas obrigado pela resposta.

1 curtida

@java_Gustavo
Com o código que eu postei, está retornando que o sistema não pode encontrar o arquivo especificado, sabe o que poderia ser?

Eu acredito que seja aqui, mas não sei o que devo mudar para que de certo.

Se o arquivo no não estiver no diretório raiz do projeto, provavelmente ele não esta retornando porque não esta encontrando o arquivo. Você tem que indicar o caminho e arquivo no construtor do File.