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.