Upload primefaces não funciona

9 respostas
jsfprimefacesjavahibernate
sgrandini

Olá pessoal!

Estou tendo dificuldade em fazer o upload de arquivos funcionar usando o atributo fileUploadListener do componente fileUpload do Primefaces. Se eu utilizar o atributo value e adicionar um commandButton chamando o método upload, funciona normalmente. Mas eu gostaria de trabalhar com a primeira forma porque preciso exibir os arquivos selecionados para o upload.

Eu não sei o que estou fazendo de errado, por isso vou colocar as bibliotecas que estou utilizando e os código abaixo pra ver se vocês podem me ajudar.

Bibliotecas
commons-fileupload-1.3.3.jar
commons-io-2.4.jar
primefaces-5.3.jar

web.xml

Primefaces FileUpload Filter
org.primefaces.webapp.filter.FileUploadFilter


Primefaces FileUpload Filter
FacesServlet
*.jsf


primefaces.UPLOADER
commons

<strong>ArquivoBean</strong>

public void transferirArquivo (String fileName, InputStream in) {

try {

OutputStream out = new FileOutputStream(new File(diretorio + fileName));

int reader = 0;

byte[] bytes = new byte[(int)getUploadedFile().getSize()];

while ((reader = in.read(bytes)) != -1) {

out.write(bytes, 0, reader);

}

in.close();

out.flush();

out.close();

} catch (IOException e) {

System.out.println(e.getMessage());

}

}
public void upload(FileUploadEvent event) {
    UploadedFile uploadedFile = event.getFile();
    String extValidate;
    if (getUploadedFile() != null) {
        String ext = getUploadedFile().getFileName();
        if (ext != null) {
            extValidate = ext.substring(ext.indexOf(".")+1);
        }
        else {
            extValidate = "null";
        }
    
        if (extValidate.equals("pdf")) {
            try {
                transferirArquivo(getUploadedFile().getFileName(), getUploadedFile().getInputstream());
            } catch (IOException ex) {
                Logger.getLogger(ArquivoBean.class.getName()).log(Logger.Level.FATAL, null, ex);
                FacesUtil.addErrorMessage("Erro ao enviar arquivo!");
            }
            FacesUtil.addInfoMessage("Arquivo enviado com sucesso!");
        }
        else {
            FacesUtil.addErrorMessage("Anexar apenas arquivo com extensão .pdf!");
        }
    }
    else {
        FacesUtil.addErrorMessage("Selecione um arquivo!");
    }
}

Componente
<p:fileUpload fileUploadListener="#{arquivoBean.upload}" label=“Escolher” uploadLabel=“Enviar” cancelLabel=“Cancelar” multiple=“true”
sizeLimit=“1048576” invalidSizeMessage=“O tamanho máximo permitido é de 1MB.” mode=“advanced”
fileLimit=“3” fileLimitMessage=“Só é possível escolher 3 arquivos por vez.” sequential=“true” />

O componente fica desse jeito depois que eu seleciono o(s) arquivo(s)

Ou seja, não acontece nada, nem uma mensagem de erro aparece e o botão Enviar continua desabilitado como se eu não tivesse escolhido arquivo algum.

Se alguém tiver um método de upload melhor do que esse, pode postar. Eu gostaria mesmo de poder fazer upload de outros tipos de arquivo, mas esse código foi o que eu consegui fazer funcionar direito, quando uso apenas o modo básico do componente.

9 Respostas

javaflex

Na minha opinião é melhor fazer diretamente em HTML/JS, pra ter o controle de tudo e não ficar quebrando a cabeca com grandes abstrações.

Se for pra pegar o nome dos arquivos no lado client:

HTML:

<input type="file" multiple="multiple" onchange="teste(this)" />

JS:

function teste(input) {
  for (var i = 0; i < input.files.length; i++) {
      console.log(input.files[i].name);
  }
}
javaflex

Sobre primefaces, já tentou os exemplos do site deles?
https://www.primefaces.org/showcase/ui/file/upload/multiple.xhtml

sgrandini

Sim, tentei e não funcionou. Se eu usar o input file do JSF, funciona, mas ele não serve para o que eu preciso. Quero usar o componente do Primefaces por causa do modo avançado.

javaflex

Debuga no browser e vê se tem algum erro antes de chegar no back-end.

E

Seu componente está dentro de um form?

Posta o form todo.

sgrandini

Sim, está dentro do h: form com o enctype=“multipart/form-data”.

javaflex

Qual Status Code do Http é retornado no navegador?

sgrandini

Não sei dizer. Como faço pra ver isso?

javaflex

Por exemplo no Chrome:

Aba Network.

Criado 27 de janeiro de 2018
Ultima resposta 3 de fev. de 2018
Respostas 9
Participantes 3