Fala Felipe, conforme conversei contigo verifica algumas coisas:
1 - o seu bean deve implementar a interface java.io.Serializable
2 - o windows pode esta bloqueado a operação de salvar arquivo por você está tentando salvar no “C:”, tente salvar o arquivo em outra partição como “D:”
4 - Verifique o escopo do seu bean (recomendo usar @ViewScoped)
5 - Como te disse, pode ser problema na versão do primefaces que você esta usando, pois não é uma versão estável. Na dúvida, tente utilizar uma versão mais recente (3.0.M4) ou a última versão estável (2.2.1)
[EDITADO]
6 - Verifica se a versões dos commons-fileupload e commons-io que você está utilizando são compatíveis com a versão do primefaces que você utiliza. (Na documentação, disponível no site, diz qual versão deve ser usada)
Fiz um pequeno exemplo aqui onde o arquivo o usuário seleciona o arquivo, manda anexar e então o bean guarda uma referência desse arquivo para salvar posteriormente, após clicar no botão “Gravar”. Dessa forma o arquivo só seria salvo se o usuário completasse o cadastro, por exemplo.
No seu código, logo após o usuário selecionar o arquivo o mesmo já é salvo, supondo que o usuário desista do cadastro você ficaria com um arquivo “sem dono”. Enfim, isso é uma questão de regra de negócio.
Irei posta o código para que você possa olhar e quem saber te ajudar.
ManagedBean
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.UploadedFile;
@ManagedBean
@ViewScoped
public class UploadBean implements java.io.Serializable {
private UploadedFile arquivo;
/* Construtor */
public UploadBean() {
}
/* Get e Set */
public UploadedFile getArquivo() {
return arquivo;
}
public void setArquivo(UploadedFile arquivo) {
this.arquivo = arquivo;
}
/* Fim Get e Set */
/**
* Trata o evento de upload e guarda uma referencia para o
* arquivo no bean
* @param evento
*/
public void uploadListener(FileUploadEvent evento) {
this.arquivo = evento.getFile();
FacesContext ctx = FacesContext.getCurrentInstance();
FacesMessage msg = new FacesMessage();
msg.setSummary("Arquivo anexado com sucesso.");
msg.setSeverity(FacesMessage.SEVERITY_INFO);
ctx.addMessage("mensagens", msg);
}
/**
* Salvar o arquivo
* @return
*/
public String salvar() {
FacesContext ctx = FacesContext.getCurrentInstance();
FacesMessage msg = new FacesMessage();
String nomeArquivo = arquivo.getFileName(); //Nome do arquivo enviado
byte[] conteudo = arquivo.getContents(); //Conteudo a ser gravado no arquivo
File file = new File("D:\\" + nomeArquivo); //Cria uma referencia para arquivo no caminho passado
try {
//Escreve o arquivo e salva
FileOutputStream fos = new FileOutputStream(file);
fos.write(conteudo);
fos.flush();
fos.close();
msg.setSummary("Arquivo salvo com sucesso!");
msg.setSeverity(FacesMessage.SEVERITY_INFO);
} catch (IOException ex) {
msg.setSummary(ex.getMessage());
msg.setSeverity(FacesMessage.SEVERITY_ERROR);
} finally {
ctx.addMessage("mensagens", msg);
return null;
}
}
}
Estou utilizando o Primefaces versão 2.2.1 (primefaces-2.2.1.jar) e as dependências “commons-fileupload-1.1.jar” e “commons-io-1.4.jar” e executando no servidor “Apache Tomcat 7.0.11”
Vlw pela a ajuda, mas nada resolveu, limpei e construi o projeto, refiz ele, usei os commons mais aplicações q precisava escrever arquivos, meu escopo [e do tipow ViewScoped, j[a tinha serializado o bean…
Muda para a última versão estável (2.2.1) e faz o teste… =)
ai posta o resultado para quem tiver o mesmo problema saber se resolveu ou não trocar a versão do primefaces.