Upload usando JSF

5 respostas
pix

Mas uma dúvida, agora com upload de imagens, segue codigos abaixo

package managedbeans;

/**
 *
 * @author daniel
 */
import java.io.File;
import java.io.FileOutputStream;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletResponse;
import org.primefaces.event.FileUploadEvent;

public class UploadArquivo {

    private String diretorio;
    private String caminho;
    private byte[] arquivo;
    private String nome;

    public UploadArquivo() {
    }

    public String getNome() {
        return nome;
    }

    public String getRealPath() {
        ExternalContext externalContext =
                FacesContext.getCurrentInstance().getExternalContext();
        HttpServletResponse response =
                (HttpServletResponse) externalContext.getResponse();
        FacesContext aFacesContext = FacesContext.getCurrentInstance();
        ServletContext context =
                (ServletContext) aFacesContext.getExternalContext().getContext();
        return context.getRealPath("/");
    }

    public void fileUpload(FileUploadEvent event, String type, String diretorio) {
        try {
            this.nome = new java.util.Date().getTime() + type;
            this.caminho = getRealPath() + diretorio + getNome();
            this.arquivo = event.getFile().getContents();
            File file = new File(getRealPath() + diretorio);
            file.mkdirs();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public void gravar() {
        try {
            FileOutputStream fos;
            fos = new FileOutputStream(this.caminho);
            fos.write(this.arquivo);
            fos.close();
        } catch (Exception ex) {
            System.out.println(ex);
        }
    }
}
package managedbeans;

import entities.Produto;
import java.io.IOException;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;
import javax.servlet.http.HttpServletRequest;
import org.primefaces.event.FileUploadEvent;
import repository.ProdutoRepository;

/**
 *
 * @author daniel
 */
@ManagedBean(name = "mbProduto")
@SessionScoped
public class ProdutoBean implements java.io.Serializable {

    private Produto produto = new Produto();
    private List<Produto> produtos;
    private UploadArquivo arquivo = new UploadArquivo();

    public void uploadAction(FileUploadEvent event) {
        this.arquivo.fileUpload(event, ".JPG", "/foto/");
        this.produto.setFoto(this.arquivo.getNome());
    }

    public void save() throws IOException {
        ProdutoRepository produtoRepository = new ProdutoRepository(this.getManager());
        produtoRepository.save(this.produto);
        this.arquivo.gravar();

        this.produto = new Produto();
        //this.produtos = null;
        this.arquivo = new UploadArquivo();
        FacesContext.getCurrentInstance().getExternalContext().redirect("produto.xhtml");
    }

    public String preparaAlterar(Produto produto) throws IOException {
        this.setProduto(produto);
        FacesContext.getCurrentInstance().getExternalContext().redirect("alterar.xhtml");
        return "alterar.xhtml?faces-redirect=true";
    }

    public void update() throws IOException {
        ProdutoRepository produtoRepository = new ProdutoRepository(this.getManager());
        produtoRepository.update(this.produto);


        this.produto = new Produto();
        this.produtos = null;
        FacesContext.getCurrentInstance().getExternalContext().redirect("listagem.xhtml");
    }

    public void remove(Produto produto) {
        ProdutoRepository repository = new ProdutoRepository(this.getManager());
        repository.remove(produto);

        this.produtos = null;
    }

    public List<Produto> getTpListas() {
        if (this.produtos == null) {
            ProdutoRepository repository = new ProdutoRepository(this.getManager());
            this.produtos = repository.getProduto();
        }

        return this.produtos;
    }

    public Produto getProduto() {
        return produto;
    }

    public void setProduto(Produto produto) {
        this.produto = produto;
    }

    private EntityManager getManager() {
        FacesContext fc = FacesContext.getCurrentInstance();
        ExternalContext ec = fc.getExternalContext();
        HttpServletRequest request = (HttpServletRequest) ec.getRequest();
        return (EntityManager) request.getAttribute("entityManager");
    }
}
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.org/ui">

    <f:view>
        <h:head>
            <title>Tipo de Lista</title>

            <style type="text/css">
                .ui-widget {font-size: 75% !important;}
            </style>
        </h:head>

        <h:body>
            <h:form id="frmGeral" enctype="multipart/form-data">
                <p:fieldset legend="Cadastro de Produto" toggleable="true">
                    <p:messages id="messages" />

                    <h:panelGrid columns="2" style="font-family: Verdana, Arial; font-weight: bold;">
                        <h:outputLabel id="lbNome" value="*Nome" for="nome" style="float: right;"/>
                        <p:inputText id="nome" size="60" value="#{mbProduto.produto.nome}" required="true"
                                     requiredMessage="Campo [Nome] é obrigatório." />

                        <h:outputLabel id="lbUndMed" value="*Unidade de Medida" for="undmed" style="float: right;"/>
                        <p:inputText id="undmed" size="60" value="#{mbProduto.produto.undmed}" required="true"
                                     requiredMessage="Campo [Unidade de Medida] é obrigatório." />

                        <h:outputLabel id="lbFoto" value="Foto" for="foto" style="float: right;"/>
                        <p:fileUpload label="Procurar" id="foto" fileUploadListener="#{mbProduto.uploadAction}" auto="true"/>

                        <p:commandButton value="Adicionar" action="#{mbProduto.save()}"
                                         update="frmGeral, messages" />

                    </h:panelGrid>
                </p:fieldset>
            </h:form>
        </h:body>
    </f:view>
</html>
O problema, quando eu clico no botão pra adicionar as fotos, mesmo que coloque um breakpoint no
public void uploadAction(FileUploadEvent event) {
ele não faz nada, não para no break e nem faz o upload.

Sempre noto que a imagem aparece em um "flash" de segundos fazendo o upload e some.

5 Respostas

pix

Tinha esquecido o web.xml está assim:

<?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> <url-pattern>*.jsf</url-pattern> <url-pattern>*.xhtml</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> </filter> <filter-mapping> <filter-name>PrimeFaces FileUpload Filter</filter-name> <servlet-name>Faces Servlet</servlet-name> </filter-mapping> <welcome-file-list> <welcome-file>faces/index.xhtml</welcome-file> </welcome-file-list> </web-app>

Alys

Qual versão do Primefaces vocês está usando? Parece que tem um problema com a 3.0M1: file upload listener not call in primefaces 3.0M1

Em todo caso, um problema similar já foi postado aqui, você viu? FileUpload do PrimeFaces não chama fileUploadListener

pix

Consegui resolver, mas infelizmente não utilizando o:

acho que está com algum bug na versão mesmo, como vou enviar apenas uma imagem por cadastro acabei usando:

VonNaturAustreVe

Você adicionou os jars para o fileupload funcionar? O commons-fileupload e commons-io ?

[]'s

pix

Sim, fiz tudo certo, desse jeito ai não funcionou nem com reza braba, não chama o metodo.

Criado 17 de setembro de 2013
Ultima resposta 18 de set. de 2013
Respostas 5
Participantes 3