Problemas em FileUpload com PrimeFaces

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.

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

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

Opa.

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

e criar este método fileUploadHandler no seu MB

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.

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.

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.

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.

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?

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

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