Estou desenvolvendo uma aplicação na qual preciso armazenar no servidor vários anexos. Baixei o richfaces 3.2.2, e estou usando o componente rich:fileUpload. Tenho quase certeza de que segui as orientações do guia do usuário. Usando o componente eu seleciono o arquivo para upload, ele diz que o upload foi feito, mas o método apontado pelo event listener não é executado. Alguém já se deparou com um problema como este?
Aqui está o código do ManagedBean:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.component.UIParameter;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;
import org.ajax4jsf.component.UIActionParameter;
import org.richfaces.event.UploadEvent;
import org.richfaces.model.UploadItem;
/**
* @since 13/02/2009
* @author Luiz Carlos Gonçalves
* @finalidade
*/
public class AnexosUploadDownload {
private ArrayList<UploadItem> listaAnexos = new ArrayList();
private UIParameter ps_numero = new UIActionParameter();
public AnexosUploadDownload() {
}
/*
* Listener chamado pelo componente upload que adiciona o arquivo a lista de
* arquivos selecionados para upload
*
* @param event
*/
public void upload(UploadEvent event) {
this.listaAnexos.add(event.getUploadItem());
}
/**
* @return the listaAnexos
*/
public ArrayList getListaAnexos() {
return listaAnexos;
}
/**
* @param listaAnexos the listaAnexos to set
*/
public void setListaAnexos(ArrayList listaAnexos) {
this.listaAnexos = listaAnexos;
}
public String salvaAnexoEmDisco() {
FacesContext fc = FacesContext.getCurrentInstance();
ServletContext sc = (ServletContext) fc.getExternalContext().getContext();
String diretorio = sc.getRealPath("/anexos/"+ps_numero.getValue().toString());
File pasta = new File(diretorio);
if (!pasta.exists()) {
pasta.mkdir();
}
FileOutputStream saida;
for (int i = 1; i < listaAnexos.size(); i++) {
File fileToCreate = new File(diretorio + "/" + listaAnexos.get(i).getFileName());
try {
saida = new FileOutputStream(fileToCreate);
saida.write(listaAnexos.get(i).getData());
saida.flush();
saida.close();
} catch (FileNotFoundException ex) {
Logger.getLogger(ProcessoSeletivo.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(ProcessoSeletivo.class.getName()).log(Level.SEVERE, null, ex);
}
}
return null;
}
/**
* @return the ps_numero
*/
public UIParameter getPs_numero() {
return ps_numero;
}
/**
* @param ps_numero the ps_numero to set
*/
public void setPs_numero(UIParameter ps_numero) {
this.ps_numero = ps_numero;
}
}
Aqui a declaração do ManageBean no facesconfig.xml
<managed-bean>
<managed-bean-name>updownload</managed-bean-name>
<managed-bean-class>pacote.AnexosUploadDownload</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
Aqui o código do rich:fileupload na página:
<rich:fileUpload
immediate="false"
immediateUpload="false"
maxFilesQuantity="1"
clearAllControlLabel="Limpar todos"
clearControlLabel="Limpar"
uploadControlLabel="Enviar"
addControlLabel="Adicionar"
doneLabel="Arquivo enviado!"
cancelEntryControlLabel="Cancelar"
id="uploadAnexos"
listHeight="100%"
listWidth="300px"
uploadData="#{updownload.listaAnexos}"
fileUploadListener="#{updownload.upload}"
>
<f:facet name="label">
<h:outputText value="{_KB}KB de {KB}KB enviados --- {mm}:{ss}" />
</f:facet>
<a4j:support event="oncompleteupload" action="#{updownload.salvaAnexoEmDisco}">
<f:param value="#{processoSeletivo.numero}" name="ps_numero" binding="#{updownload.ps_numero}"/>
</a4j:support>
</rich:fileUpload>