Domine o componente FileUpload do PrimeFaces

Postado por em   ●   41 comentários

Você que usa PrimeFaces, gostaria de dominar o componente de upload de arquivos?

Saber que existe um componente para upload de arquivos na biblioteca do PrimeFaces não diminui muito a quantidade de problemas que podemos ter ao utilizá-lo.

Uma simples configuração errada pode fazer você perder 1 hora enquanto poderia ter gasto apenas 10 minutos, se soubesse um pouco mais de detalhes sobre o componente.

Considerando que o carregamento de arquivos é uma funcionalidade bastante utilizada, acredito (e acho que você vai concordar comigo) que o legal mesmo é conhecer o funcionamento do p:fileUpload.

Caso você queira ser proativo e tomar conhecimento sobre esse componente útil em nosso dia a dia, então continue lendo o artigo para aprender mais sobre:

  • Como fazer um upload compatível com browsers mais antigos ou não-ajax
  • Fazer upload utilizando o modo avançado
  • Carregar mais de um arquivo por vez
  • Fazer upload automático
  • Limitar o tamanho e a quantidade de arquivos carregados
  • Filtrar os tipos dos arquivos que poderão ser escolhidos
  • Escolher arquivos utilizando drag and drop
  • Como fazer o download dos arquivos

Interessado? Vamos lá então.

Primeiras configurações

O componente p:fileUpload consegue fazer o upload de arquivos de duas formas:

  • native: para quem utiliza a API de Servlets 3+
  • commons: utiliza o projeto Commons FileUpload e funciona mesmo em um ambiente com a API de Servlets na versão 2.5

Caso tenha necessidade de escolher uma específica, você precisa configurar o parâmetro primefaces.UPLOADER no web.xml, como abaixo:

Como você pode ver, temos também a opção auto que é a padrão e, simplesmente, entrega para o componente a escolha de qual utilizar.

Para essa escolha, o componente verifica se você está utilizando o JSF 2.2+, se sim, então é selecionado o uploader native e, caso não, seleciona-se o commons.

Se você optar por native explicitamente, é preciso certificar que está em um ambiente com API de Servlets 3+, com a vantagem que não depende de nenhuma biblioteca externa.

Optando pelo modo commons vai ser necessário, claro, incluir o projeto Commons FileUpload no path da sua aplicação (como, por exemplo, na pasta WEB-INF/lib).

A vantagem do modo commons é que o upload vai funcionar independente da versão da API de Servlets (tanto na 2.5 quando na 3.0+).

Uma ressalva ao se utilizar o modo commons, é que você também vai precisar configurar o filtro FileUploadFilter:

O filtro é necessário, pois, é feita uma espécie de pré-configuração para que o componente consiga terminar o processo de upload utilizando o projeto Commons FileUpload.

Ainda falando do filtro, é possível configurar dois parâmetros junto com ele:

O parâmetro thresholdSize determina até que tamanho é permitido manter o arquivo na memória. Passando da quantidade configurada, o arquivo é escrito no disco. Ele é configurado em bytes.

Já o parâmetro uploadDirectory é somente para indicar em qual diretório que você deseja que os arquivos sejam salvos durante o upload.

Lembrando que o diretório do parâmetro uploadDirectory não é algo definitivo. Esse é um lugar provisório para que os arquivos fiquem até que você dê o devido tratamento a eles como veremos mais tarde neste artigo.

Afinal, qual configuração é necessária?

Depois dessas opções que passei para você, talvez fique na dúvida sobre qual combinação escolher. Quero esclarecer isso.

Se você utiliza:

  • Servlet 3.0+
  • JSF 2.2+

Então não vai precisar de configuração alguma para utilizar o componente p:fileUpload.

Isso porque, sem configuração explícita, o PrimeFaces vai assumir o valor auto para o parâmetro primefaces.UPLOADER e com isso vai utilizar a API nativa de Servlet para realizar o upload.

Caso você utilize qualquer uma das duas opções abaixo:

  • Servlet 2.5; ou
  • Até a versão 2.1 do JSF

Então vai precisar utilizar o projeto Commons FileUpload.

Para utilizar o projeto Commons FileUpload você pode informar explicitamente o primefaces.UPLOADER com o valor commons ou deixar sem configuração, caso esteja utilizando até a versão 2.1 do JSF.

Não esqueça do filtro se for utilizar o valor commons. :)

Como fazer upload básico (ou não-ajax)

Apesar dos muitos casos em que já podemos fazer upload com HTML5, ainda é preciso contar com um suporte para upload básico.

No upload básico, o resultado em HTML que é retornado ao navegador, é uma simples tag input com o atributo type igual a file.

Seria para quem precisa manter compatibilidade com navegadores antigos ou, quem sabe, por algum requisito específico do seu projeto.

Para fazer o uso do upload básico você necessita somente da configuração abaixo:

A primeira coisa a se reparar é que a tag h:form precisa do atributo enctype para que o componente p:fileUpload funcione com as configurações acima.

O padrão do atributo mode é advanced, então precisamos configurá-lo com a opção simple para utilizar o upload básico.

No valor do componente (atributo value) precisamos fazer o vínculo com uma propriedade do tipo UploadedFile:

Para submeter o formulário, no modo simples, precisamos de um botão com o atributo ajax igual a false (a submissão da página será total).

Salvando o arquivo no modo simples

Quando o método que está no actionListener do seu botão for invocado, você usará a propriedade do tipo UploadedFile para salvar o arquivo.

O seu atributo do tipo UploadedFile vai lhe dar acesso aos seguintes métodos:

  • getFileName() para acessar o nome do arquivo
  • getContents() (ou getInputstream()) para pegar os bytes do arquivo
  • getContentType() que retorna o tipo do conteúdo do arquivo

Com isso você pode utilizar o código abaixo para salvar o arquivo no disco:

Obviamente você pode salvar o arquivo onde quiser. O código acima foi só como um exemplo para guiar quem está utilizando essa pequena API a primeira vez.

No trecho acima não utilizamos o método getContentType. Em nosso exemplo ele não foi necessário, mas você precisará guardar o retorno dele em algum lugar caso queira configurar o cabeçalho HTTP Content-Type em uma possível função de download desses arquivos.

Aparência do componente de upload no modo simples

Da forma como mostrei a configuração do componente p:fileUpload, ele será impresso da seguinte maneira:

Upload básico sem skin

Caso queira o input mais parecido com o resto dos componentes do PrimeFaces, você vai precisar configurar o atributo skinSimple como true:

A configuração acima vai assumir uma aparência similar aos outros componentes:

Upload básico com skin

Upload avançado

A menos que alguma circunstância do projeto te obrigue a utilizar o modo simples, imagino que você vai preferir o modo avançado.

O modo avançado é padrão. Você pode tanto utilizar o atributo mode com o valor advanced como omiti-lo:

Note que fica até mais simples a configuração do modo advanced, não é mesmo? :)

É claro que podemos (e iremos ver isso) incluir muitos outros atributos para customizar o modo avançado, mas, para ter o mesmo efeito que o modo básico, precisamos somente do trecho acima.

A maior diferença na tag do componente é que, ao invés de utilizar o atributo value com vínculo para uma propriedade do tipo UploadedFile, temos o atributo fileUploadListener sendo vinculado ao método upload que agora recebe um parâmetro do tipo FileUploadEvent:

Dessa forma não precisamos ter um botão com algum actionListener como tínhamos o botão “Enviar” no exemplo do modo simples.

No modo avançado o próprio componente já nos dá um botão para iniciarmos o upload:

Upload avançado

Seria o botão “Upload” da imagem acima.

Como você viu, na renderização do componente, também temos mudanças consideráveis.

O botão “Choose”, que abre a janela do browser para escolha do arquivo, continua e são acrescentados mais dois: “Upload” e “Cancel”.

Sobre o botão “Upload”, acabamos de falar, ele inicia o envio dos arquivos para o servidor.

Já o botão “Cancel”, bem intuitivo, serve para cancelar o envio do arquivo.

Quanto ao rótulo de cada botão, podem ser customizados através dos atributos:

  • label
  • uploadLabel
  • cancelLabel

O componente fica:

E a renderização:

Upload avançado com rótulo customizado

Nota sobre o atributo label

Muitas vezes utilizamos o componente p:fileUpload junto com uma tag p:outputLabel.

Repare nessa configuração:

Agora veja o que ela renderiza:

p:outputlabel e p:fileupload

Observe que o rótulo do botão “Choose” não ficou com o valor “Escolher” que foi configurado no atributo label.

Ele ficou com o valor “Arquivo” que é igual ao que está no atributo value do componente p:outputLabel.

Isso é porque a tag outputLabel do PrimeFaces procura o componente que é informado em seu atributo for e, se esse componente estender javax.faces.component.UIInput, ele configura o rótulo dele com o mesmo valor que está em seu atributo value.

Veja que apesar do atributo value do p:outputLabel ser “Arquivo: ”, o caractere “:” (dois pontos) é retirado antes de se configurar o atributo label do UIInput (que, nesse caso, é o org.primefaces.component.fileupload.FileUpload).

Customizando o modo avançado do componente p:fileUpload

Temos algumas opções bem bacanas de customização desse componente.

Gostaria de destacar aqui as seguintes:

  • allowType
  • sizeLimit
  • fileLimit
  • multiple
  • auto
  • dragDropSupport
  • sequential
  • onstart
  • onerror
  • oncomplete

Filtrar o arquivo por tipo

A primeira opção é a de filtrar o arquivo que o usuário pode escolher. O mais comum é filtrar pela extensão.

Fazemos isso com o uso do atributo allowTypes:

No exemplo de configuração acima estamos permitindo somente imagens (gif, jpeg, jpg e png).

Mesmo que você já tenha alguma validação no servidor, esse atributo economiza a requisição de um upload desnecessário.

Limitar o tamanho de cada arquivo

Muitas aplicações precisam estar protegidas da inocência de usuários que não ligam para o tamanho dos arquivos na hora de fazer algum upload. :)

Para isso temos o atributo sizeLimit:

Ele, claro, limita o tamanho do arquivo que o usuário pode escolher. O valor dele deve ser informado em bytes.

No exemplo acima o limite para upload é de 1KB.

Limitar a quantidade de arquivos

O p:fileUpload, no modo avançado, permite que o usuário escolha vários arquivos antes de clicar em “Upload” (ou “Enviar”).

Você consegue limitar essa quantidade através do atributo fileLimit:

Com a configuração acima você consegue limitar em somente 5 arquivos.

Permitir a seleção de múltiplos arquivos

Como comentei no tópico anterior, no modo avançado é possível escolher vários arquivos antes de enviá-los, mas, por padrão, para cada arquivo que o usuário escolher, ele precisa clicar no botão “Choose” (ou “Escolher”) novamente.

Através do atributo multiple você consegue permitir com que o usuário selecione quantos arquivos ele quiser.

Assim, se ele precisar selecionar 5 arquivos que estão em uma mesma pasta, não será preciso clicar no botão “Choose” 5 vezes. Vai dar para fazer a seleção dos 5 arquivos de uma só vez:

Upload avançado com seleção múltipla

E a tag fica:

Enviar os arquivos automaticamente

Uma opção que pode ser bacana para os usuários é a de enviar os arquivos automaticamente, ou seja, não será necessário o clique no botão “Upload” (ou “Enviar”).

Na verdade, o botão “Upload” nem é renderizado quando configuramos o atributo auto como true:

Upload avançado com envio automático

Veja também a tag:

Suporte a drag and drop

Esse já vem configurado por padrão. Logicamente o browser precisa suportar essa funcionalidade.

Para desabilitá-la, você deve fazer como abaixo:

Fazer o envio dos arquivos de forma sequencial

Quando apertamos o botão “Upload” (ou “Enviar”) do componente p:fileUpload, os arquivos são enviados em requisições concorrentes.

Se, por algum motivo, você quiser que as requisições sejam feitas uma por vez, então será preciso configurar o atributo sequential como true:

Com isso você garante que o segundo arquivo vai esperar o primeiro ser enviado, e assim sucessivamente.

Eventos JavaScript (onstart, onerror, oncomplete)

O p:fileUpload dá a possibilidade de você configurar três tipos de callbacks diferentes, caso ache necessário.

São bem intuitivos, mas eu gostaria de explicá-los também.

No onstart você pode deixar algum JavaScript que vai ser disparado a cada vez que o processo para envio de arquivos se inicia.

Se você estiver utilizando o atributo auto como true, o callback onstart será disparado a cada arquivo que o usuário escolher. Já se o envio não estiver no automático, então o callback será disparado sempre que o botão “Upload” (ou “Enviar”) for clicado.

Quanto ao callback onerror, você deixa algum código JavaScript que queira disparar para o caso da requisição falhar.

Teríamos o callback onerror disparado nos casos de, por exemplo, o servidor ter saído do ar pouco antes do usuário clicar no botão “Upload” (ou “Enviar”).

Por último, o callback oncomplete será chamado sempre que o processo terminar. Digo processo e não requisição, pois, no caso do servidor estar fora do ar, o oncomplete será invocado mesmo não tendo ocorrido requisição.

O  callback oncomplete sempre é chamado, em caso de sucesso ou erro.

A configuração da tag é bem simples, mas vou deixar um exemplo aqui também:

Como fazer o download com PrimeFaces

Já que, muitas das vezes que o arquivo vai, ele precisa voltar, veremos também como descarregar um arquivo utilizando o componente p:fileDownload do PrimeFaces.

O que você precisa é da configuração:

Temos um p:commandButton com o p:fileDownload aninhado a ele. Para que a configuração acima funcione é preciso que a propriedade vinculada ao atributo value seja de algum tipo que implemente a interface StreamedContent:

Esse tipo pode ser, por exemplo, DefaultStreamedContent:

Assim você já consegue fazer o download de arquivos, mas, caso queira preparar o download no momento em que o usuário clicar no botão, então você pode configurar um actionListener no botão:

… e no managed bean:

Uma nota para quem usa Java 7+: é possível ter acesso ao Content-Type de um arquivo (que no exemplo acima é “image/jpg”) com o código:

É útil para quem não guardou o Content-Type dos arquivos que salvamos no momento do upload. :)

Conclusão

Acredito que falamos muito mais do que você precisa para simplesmente utilizar o componente p:fileUpload. Com o conhecimento que está aqui, você pode dizer que domina esse componente. :)

Vimos como fazer o upload básico para o caso de precisar de compatibilidade com browsers antigos.

Depois passamos pelo upload avançado e as várias configurações que podemos fazer com ele.

Por último, aprendemos a fazer o download, já que muitas das vezes ele será necessário, principalmente, para quem já teve que implementar o upload.

Você que chegou até aqui, provavelmente gosta de PrimeFaces ou, pelo menos, usa ele em seu trabalho. Estou certo?

Se sim, então vai gostar do e-book de Java EE 7 (com JSF, PrimeFaces e CDI). Esse artigo aqui é só um incremento diante de tudo que você irá encontrar no e-book.

Clique abaixo para fazer o download:

E-Book Java EE 7 com JSF, Primefaces e CDI

No mais, um abraço pra você e até uma próxima!

PS: Você pode acessar o código-fonte dos exemplos em nosso perfil do GitHub: http://github.com/algaworks/artigo-jsf-primefaces-fileupload

É graduado em Sistemas de Informação, trabalha como instrutor na AlgaWorks e está no mercado de programação Java há mais de 8 anos, principalmente no desenvolvimento de sistemas corporativos.

41 comentários sobre “Domine o componente FileUpload do PrimeFaces

  1. Luis Cevallos -

    Hola muchas Gracias pero si puede hacer un video de este tema se le agradeceria mucho pero mucho mas.

    Que tenga un buen dia

  2. Alexandre Afonso Autor do post-

    Luis, agora que o post foi escrito não dá para saber quando poderemos gravar um vídeo sobre o mesmo assunto. Não é má vontade. É porque tem alguns outros assuntos na fila para serem escritos e gravados.

    Sugiro que você tente seguir os exemplos do artigo e use o nosso grupo de discussão para tirar suas dúvidas: http://www.facebook.com/groups/1467881680180826/

    Abraço!

  3. olavo alves -

    Grande Alexandre, Parabéns pelo trabalho!!!

    1. Alexandre Afonso Autor do post-

      Valeu Olavo!

  4. olavo alves -

    Alexandre, uma duvida, lá no CadastroProduto.xhtml, existe a possibilidade de implementar o para exibir a imagem selecionada no ?

    obs: assim que o usuário selecionar o arquivo e antes de clicar no <h:commandButton id="Adicionar".

    Se sim, como seria ? abraço

  5. Alexandre Afonso Autor do post-

    Você quer mostrar para o usuário a imagem que ele escolheu antes do upload ser feito. É isso Olavo?

    Se for, tem jeito sim. O próprio componente faz isso para você.

    Abraço!

  6. olavo alves -

    Isso mesmo , estou estudando o componente no modo single e multiple, obrigado! valeu

  7. Franclayton -

    Tem como adicionar um confirmDialog ao clicar no botão Upload e cancelar ou submeter de acordo com a resposta?

  8. Alexandre Afonso Autor do post-

    Franclayton, nativamente não. Você pode fazer algo assim:

    PF(‘fileUploadWidgetVar’).uploadButton.one(‘click’, function(){
    //abrir a dialog de confirmação aqui.
    });

    E no “sim” do diálogo de confirmação você faz:

    PF(‘fileUploadWidgetVar’).uploadButton.click();

    Não é um jeito muito legal, creio eu, mas se isso é importante pra você, então vai servir.

    Abraço!

  9. wilker Jose de Oliveira -

    Tem como mostrar a imagem quando fizer o upload.

  10. Alexandre Afonso Autor do post-

    Wilker, depois do download, você pode usar um servlet comum que será usado a partir das tags img ou graphicImage.

    Abraço!

  11. Silas Santos -

    Muito bom!! Obrigado por compartilhar.

  12. Alexandre Afonso Autor do post-

    Valeu Silas!

  13. André Bitencurt -

    Alexandre, eu consigo gravar no banco de dados o caminho do arquivo e depois recuperar ele pra download ?

  14. Alexandre Afonso Autor do post-

    André, com certeza. Você pode depois criar um Servlet que receberá o identificador do arquivo, pesquisa o caminho dele na base e devolve o mesmo na resposta.

    Abraço!

  15. Julio Cezar -

    Gostei bastante do conteúdo, mais eu gostaria de ver, um post, explicando como fazer upload de imagens, salvar em um diretório exemplo C://, gravar o caminho do arquivo e salvar no banco de dados e depois visualizar esta imagem na pagina com o graphicImage

  16. rafael -

    Estou com o seguinte problema usando
    private UploadedFile file;

    public UploadedFile getFile() {
    return file;
    }

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

    public void upload() {
    if(file != null) {
    FacesMessage message = new FacesMessage(“Succesful”, file.getFileName() + ” is uploaded.”);
    FacesContext.getCurrentInstance().addMessage(null, message);
    }
    }

    Com este código não apareceu o commandbutton . dá uma olhada só. https://snag.gy/2cxBQq.jpg neste link

    Lembro que estou utilizando primefaces 5 e jsf 2.2 isto faz diferença correto?

  17. rafael -

    boa tarde seguindo o post anterior segue o codigo do commandbutton :

  18. rafael -

    <–!

    !–>

  19. Alexandre Afonso Autor do post-

    Rafael,

    Nesse seu caso, não está parecendo problema de versão. Você já tentou inspecionar para verificar se o botão está na página. Digo isso, pois, ele pode não estar sendo exibido, mas estar lá.

    Abraço!

  20. rafael -

    realmente ele não está endo exibido porque?

  21. thiago -

    Alexandre, gostaria de saber se no modo de seleção de múltiplos arquivos tem alguma forma de passar uma string informada pelo usuario?

    1. Alexandre Afonso Autor do post-

      Thiago,

      Como funcionalidade do próprio componente de uploads, infelizmente, não.

      Mas, talvez isso aqui ajude: http://stackoverflow.com/a/17236222/2847716

      Até!

  22. Humberto -

    Alexandre, procurei no show case do prime e não achei nada parecido com oq preciso, será que consegue me ajudar?
    O caso é o seguinte, tenho uma aplicação que caso o usuário deseje irá salvar algumas informações do bd em arquivo, mas esses arquivos serão gerados no server devido o tamanho ou até mesmo a demora que pode ocorrer devido a quantidade de dados. Mas enfim o usuário precisa informar para aplicação em qual pasta será gerado esses arquivos caso o usuário queira, pra não haver erros queria que ele selecionasse a pasta ao invés de digitar o caminho todo. Será que seria possível isso acontecer? Obrigado

    1. Alexandre Afonso Autor do post-

      Humberto, bom dia! Existem algumas formas diferentes de resolver isso. Um jeito simples seria você, no seu servidor, escolher um diretório que será o raiz do seus arquivos, mas esse diretório o usuário final não terá conhecimento. Daí você lista, para os seus usuários, os diretórios que estão abaixo dessa pasta raiz no servidor. Pode exibir com a ajuda do componente Tree ou até mesmo um DataGrid. Vai depender do que você vai preferir.

      Abraço!

  23. Lays Veloso -

    Gostaria de saber se existe uma forma de enviar uma descrição juntamente com o arquivo selecionado.

    Exemplo, seleciono a imagem de um empreendimento e acrescento em um campo a seguinte descrição: “Fachada do empreendimento” e na sequência, envio

  24. Rui G -

    Olá Alexandre,

    Adorei o post! Contudo, continuo com um problema bem bizarro:
    Eu tenho 2 inputTextArea (required) e um fileUpload na minha página. O ficheiro que faço upload, tem dados para preencher os inputTextArea, caso o user não pretenda preencher manualmente.

    Então, eis o que acontece:
    > Se faço upload do ficheiro, os campos são preenchidos corretamente e apresentam os valores contidos no file carregado.
    > Se preencho os input e só depois faço upload, o valor não é alterado.

    Reparei que o fileUploadListener não é chamado em nenhum dos casos.

    Tenho o update definido no fileUpload.

    Acha que pode ajudar?

    Obrigado!
    Rui G

    1. Alexandre Afonso Autor do post-

      Olá Rui!

      Tem mais detalhes sobre esse problema. Se tiver elabore sua pergunta aqui em nossa comunidade de programadores Java http://alga.works/comunidadejava Porque só com o que colocou aqui não dá para elaborar uma resposta exata.

      O que eu aconselho que faça é baixar o projeto aqui do artigo e tentar implementar isso nele. Como tenho certeza que comitei o projeto no GitHub funcionando, então basta acrescentar esses novos campos e fazer um teste. Com certeza, isso vai ajudar você a implementar no seu projeto.

      Até!

  25. Vinícius Barbosa -

    Olá, Alexandre.
    Poderia me dar alguma dica que como salvar essas imagens no banco em vez de arquivos?
    Estou desenvolvendo uma aplicação onde um usuário poderá cadastrar um pedido de patente e no final terá a opção de anexar as imagens ao pedido.
    Toda a parte que envolve texto já está pronta, porém estou preso nessa parte das imagens. Poderia me ajudar? Abraço!

    1. Alexandre Afonso Autor do post-

      Olá Vinícios!

      Está usando JPA? Se estiver então é só mapear uma propriedade “byte[]” com @Blob.

      Abraço!

  26. Eric Bernardes -

    Olá Alexandre.
    Implementei o exemplo na minha aplicação para fazer o upload de uma planilha,mas não acontece nada e o método do upload do bean não recebe o evento. Fui no console no navegador e apresenta a seguinte informação: XMLHttpRequest síncrono não deve ser usado na thread principal devido a seus efeitos prejudiciais para a experiência de usuário. Para mais informações http://xhr.spec.whatwg.org/

    Já olhei a implementação e não sei o porque de acusar ajax síncrono

    1. Alexandre Afonso Autor do post-

      Olá Eric!

      Infelizmente ainda não me deparei com esse problema. Mas você já tentou pegar o projeto do artigo e fazer o upload? Isso seria só para descartar qualquer problema de configuração e ambiente do projeto.

      Abraço!

  27. Eric Bernardes -

    Oi Alexandre,

    A Algaworks deveria incluir no curso de Primefaces o upload de arquivos. Aqui no blog você ensina, mas quando usa o spring security ele bloqueia o envio de arquivos. Já pesquisei sobre o assunto, mas não encontrei nada concreto, que resolvesse o problema. Obrigado.

    1. Alexandre Afonso Autor do post-

      Oi Eric!

      De qual curso você está falando? Se for o curso Sistemas Comerciais, nós gravamos uma aula sobre isso e em pouco tempo vamos disponibilizar para os alunos.

      Até!

  28. Mário Jorge -

    Olá Alexandre,

    Como posso persistir esse arquivo no banco de dados

    1. Alexandre Afonso Autor do post-

      Olá Mário!

      Se estiver usando JPA, então é só mapear uma propriedade “byte[]” com a anotação @Blob.

      Abraço!

  29. Akira -

    Oi Alexandre!

    Sabe me dizer quando a aula de upload com Primefaces no curso de sistemas comerciais será disponibilizado? Estou tentando salvar o arquivo no banco de dados, porém está ocorrendo erro:

    “org.primefaces.model.UploadedFileWrapper cannot be cast to java.sql.Blob”

    No meu método salvar que salva o formulário todo coloquei isso:

    File arquivoUpload = new File(procedimentoComplianceHQ.getArquivo().getFileName());
    byte[] arquivoByte = new byte[(int) arquivoUpload.length()];
    try {
    FileInputStream fileInputStream = new FileInputStream(arquivoUpload);
    fileInputStream.read(arquivoByte);
    fileInputStream.close();
    } catch(IOException e) {
    e.printStackTrace();
    }

    Pode me ajudar?

  30. Akira -

    Alexandre, já consegui.
    Porém, toda vez tenho que fazer o upload do arquivo e depois salvar o formulário para que todos os campos sejam salvos no banco de dados, devido ao uso do “FileUploadListener”. Há alguma forma de salvar todos os campos do formulário de uma vez só junto com o arquivo?

    1. Alexandre Afonso Autor do post-

      Akira,

      Como funcionalidade do próprio componente de uploads, infelizmente, não. Talvez isso aqui ajude: http://stackoverflow.com/a/17236222/2847716

      No seu caso o que eu faria é deixar o upload automático. Assim a pessoa só vai precisar clicar em salvar, como de praxe.

      Abraço!

Deixe um comentário