Problemas em FileUpload com PrimeFaces

10 respostas
programaçãojsfprimefacesjava
programadorars

Alguém poderia me dar um exemplo de Upload de documentos com PrimeFaces? Pesquisei em muitos lugares, inclusive aqui no GUJ, mas não obtive bons resultados. Eu preciso fazer upload de um arquivo de texto, e em seguida pegar o conteúdo desse documento.

10 Respostas

edumatias

Opa

Veja este exemplo que usei em um sistema meu com Primefaces para upload de imagem (serve também para outros uploads)

Na view

<p:fileUpload id="imageUpload" fileUploadListener="#{clienteMB.fileUploadHandler}" mode="advanced" auto="true" skinSimple="true"  
	allowTypes="/(\.|\/)(gif|jpe?g|png)$/" label="Selecione uma imagem" invalidSizeMessage="A imagem é grande demais!" update="panelFachada,imagemFachada"
	style="width:100% !important;margin-bottom: -25px;" 
	sizeLimit="500000" />

No ManagedBean

public void fileUploadHandler(FileUploadEvent event) throws Exception {
	Long tamanhoImagem = event.getFile().getSize();
	byte[] imagemPrincipalOficina = FileUtils.toByteArray(event);
}

Ou seja, você terá o imagemPrincipalOficina que é um array de bytes para trabalhar com ele.

Caso veja nulo, altere o escopo do ManagedBean.

No meu caso está

@Scope(value = WebApplicationContext.SCOPE_SESSION)

[]'s

programadorars

Olá, este código está funcionando corretamente aí? Aqui não deu certo. Apareceu o seguinte erro:
/index.xhtml @16,23 fileUploadListener="#{clienteMB.FileUploadHandler}": Target Unreachable, identifier ‘clienteMB’ resolved to null

Quanto ao @Scope(value = WebApplicationContext.SCOPE_SESSION) , não entendi bem pra que serve, quando coloquei no código o compilador pediu que criasse a classe “WebApplicationContext”.

edumatias

Opa.

Cara, você deve trocar o ClienteMB pelo seu ManagedBean, saca?

e criar este método fileUploadHandler no seu MB

programadorars

Amigo, eu entendo. Ainda não adicionei o seu método ao meu projeto. Criei um novo pra testá-lo primeiro, e não deu certo, apareceu os erros que mencionei.

edumatias

Opa,

Desculpe, apenas passei como modelo. No seu caso é JSF puro utilize @SessionScoped e ManagedBean(name = “meuBeanMB”) para anotar seu bean e dar um nome a ele.

<p:fileUpload id="imageUpload" fileUploadListener="#{meuBeanMB.fileUploadHandler}" mode="advanced" auto="true" skinSimple="true"  
	allowTypes="/(\.|\/)(gif|jpe?g|png)$/" label="Selecione uma imagem" invalidSizeMessage="A imagem é grande demais!" 
	style="width:100% !important;margin-bottom: -25px;" 
	sizeLimit="500000" />

Pra que você possa testar você deve implementar este método fileUploadHandler no seu MB. Lembre-se que se faz necessário o uso da biblioteca Primefaces.

OBS: Este código utilizei para fazer upload de imagem.

programadorars

Olha, aqui eu coloquei da seguinte maneira, e não está dando certo:

fileupload.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui">
    <h:head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />

    </h:head>
    <h:body>
        
        <h:form enctype="multipart/form-data">
 
            <p:fileUpload id="imageUpload" fileUploadListener="#{clienteMB.fileUploadHandler}" mode="advanced" auto="true" skinSimple="true"  
	allowTypes="/(\.|\/)(gif|jpe?g|png)$/" label="Selecione uma imagem" invalidSizeMessage="A imagem é grande demais!" 
	style="width:100% !important;margin-bottom: -25px;" 
	sizeLimit="500000" />

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

clienteMB.java

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.Serializable;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.UploadedFile;
 
@ManagedBean(name="clienteMB")
@RequestScoped
 
public class clienteMB implements Serializable{
    public void fileUploadHandler(FileUploadEvent event) throws Exception {
	Long tamanhoImagem = event.getFile().getSize();
	byte[] imagemPrincipalOficina = FileUtils.toByteArray(event);
        //System.out.println("\n\n\nTAMANHO\n\n\n" + tamanhoImagem);
    }
    
}

web.xml (tem muita coisa, fui colocando todo filtro que encontrava kk)

<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>*.jsf</url-pattern>
</servlet-mapping>

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

<context-param>
    <param-name>primefaces.UPLOADER</param-name>
    <param-value>commons</param-value>
</context-param>

<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>
    <init-param>
      <param-name>thresholdSize</param-name>
      <param-value>10240</param-value>
    </init-param>
    <init-param>
      <param-name>uploadDirectory</param-name>
      <param-value>/tmp/algaworks/uploads</param-value>
    </init-param>
</filter>


<session-config>
    <session-timeout>
        30
    </session-timeout>
</session-config>
<welcome-file-list>
    <welcome-file>index.jsf</welcome-file>
</welcome-file-list>

Além dos erros que eu citei em uma das respostas acima, dá erro no toByteArray, mas não especifica o que está errado.

edumatias

Caramba.

Na verdade eu imaginei que o seu projeto JSF já estivesse configurado e funcionando.

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
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.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.UploadedFile;

@SessionScoped     
@ManagedBean(name="clienteMB")
public class clienteMB implements Serializable{
    private static final long serialVersionUID = 1L;

    public void fileUploadHandler(FileUploadEvent event) throws Exception {
	        Long tamanhoImagem = event.getFile().getSize();
	        byte[] imagemPrincipalOficina = FileUtils.toByteArray(event);
     }
}

Cometi um erro de não ter te enviado a classe FileUtils.

Crie ela e implemente:

public static byte[] toByteArray(FileUploadEvent event) throws IOException {
       UploadedFile file = event.getFile();
       InputStream inputstream = file.getInputstream();
       return IOUtils.toByteArray(inputstream);
}

Por fim, remova do seu 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>

<context-param>
    <param-name>primefaces.UPLOADER</param-name>
    <param-value>commons</param-value>
</context-param>

<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>
    <init-param>
      <param-name>thresholdSize</param-name>
      <param-value>10240</param-value>
    </init-param>
    <init-param>
      <param-name>uploadDirectory</param-name>
      <param-value>/tmp/algaworks/uploads</param-value>
    </init-param>
</filter>

Debugue, veja se está entrando no método ao efetuar upload.

Veja se algo está vindo nulo.

Faça testes diversos.

programadorars

Consegui pegar alguns dados do arquivo do Upload com esse código aí. No meu caso, é um arquivo de texto. Alguém sabe como eu pego o conteúdo dele?

edumatias

Você quer fazer upload de um txt por exemplo e ler ele?

programadorars

Isso mesmo. Mas não faço ideia de como fazer. Tem algum comando do tipo getFileName(), mas pra pegar o conteúdo?

Criado 18 de outubro de 2017
Ultima resposta 20 de out. de 2017
Respostas 10
Participantes 2