Upload primefaces não funciona

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

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

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);
  }
}

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

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.

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

Seu componente está dentro de um form?

Posta o form todo.

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

Qual Status Code do Http é retornado no navegador?

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

Por exemplo no Chrome:

Aba Network.