Upload usando JSF

5 respostas
P

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

P

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>

A

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

P

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:

V

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

[]'s

P

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