Boa tarde, estou tentando fazer upload de varias imagens usando o file upload,
como para usar o file upload o scopo deve ser como session,
foi necessário fazer dois beams diferentes,
um com SessionScope e outro com RequestScope,
pq com sessionScope ou ViewScope, o file upload funciona mas o FacesContext.addMensage(…) não funciona para mandar mensagens a tela.
então não estou sabendo fazer o upload de varias imagens ao mesmo tempo.
segue os códigos para facilitar a ajuda.
CadastrarAnimal.xhtml
<h2>Cadastro de Animais</h2>
<h:messages style="color:red" />
<h:form id="tipoAnimal" >
<h:inputHidden value="#{animalBean.animal.id_animal}" />
<h:panelGrid columns="2" cellpadding="5" width="400" >
<p:outputLabel value="Nome: " for="nome" styleClass="label"/>
<p:inputText id="nome" label="Nome" value="#{animalBean.animal.nome}" required="true" requiredMessage="O campo Nome deve ser informado!" size="35" maxlength="30"/>
<p:outputLabel value="Sexo:" for="nome" styleClass="label"/>
<p:selectOneRadio id="sexo" value="#{animalBean.animal.sexo}" required="true" requiredMessage="O campo Sexo deve ser informado!">
<f:selectItems value="#{animalBean.sexo}" var="sexo" itemValue="#{sexo.codigo}" itemLabel="#{sexo.descricao}" />
</p:selectOneRadio>
<p:outputLabel value="Idade" for="idade" styleClass="label"/>
<p:inputText id="idade" value="#{animalBean.animal.idade}" required="true" requiredMessage="O campo Idade deve ser informado!" />
<p:outputLabel value="Descrição:" for="descricao" styleClass="label"/>
<p:inputTextarea id="descricao" value="#{animalBean.animal.descricao}" rows="7" cols="50" required="true" requiredMessage="O campo Descrição deve ser informado!" />
<h:outputLabel value="Fotos:" for="foto" />
<p:fileUpload id="foto" fileUploadListener="#{fotoBean.uploadAction}"
multiple="true"mode="advanced"
allowTypes="/(\.|\/)(gif|jpe?g|png)$/" required="true"/>
<h:outputText/>
<h:commandButton value="Inserir" action="#{animalBean.salvar()}" />
</h:panelGrid>
</h:form>
FotoBeam
@ManagedBean(name="fotoBean")
@SessionScoped
public class FotoBean {
private Foto foto = new Foto();
private List<String> lista = new ArrayList<String>();
private List<UploadArquivo> lista_arquivos = new ArrayList<UploadArquivo>();
private UploadArquivo arquivo;
public Foto getFoto() {
return foto;
}
public void setFoto(Foto foto) {
this.foto = foto;
}
//tenho que zerar a lista_arquivos ao terminar de jogar o mesmo na sessão pq ta só adicionando novos objetos a lista
public void uploadAction (FileUploadEvent event){
this.arquivo = new UploadArquivo();
this.arquivo.fileUpload(event, "/resources/img/");
this.lista_arquivos.add(arquivo);
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("listaobjUpload", lista_arquivos);
}
}
Upload arquivos
public class UploadArquivo {
private String caminho;
private byte[] arquivo;
private String nome;
public String getNome() {
return nome;
}
public String getRealPath() {
FacesContext aFacesContext = FacesContext.getCurrentInstance();
ServletContext context = (ServletContext) aFacesContext.getExternalContext().getContext();
return context.getRealPath("/");
}
public void fileUpload(FileUploadEvent event, String diretorio) {
try {
this.nome = event.getFile().getFileName();
this.caminho = getRealPath() + diretorio + getNome();
this.arquivo = event.getFile().getContents();
File file = new File(getRealPath() + diretorio);
file.mkdirs();
} catch (Exception ex) {
System.out.println("Erro no upload do arquivo" + ex);
}
}
public void gravar() {
try {
FileOutputStream fos;// FileOutputStream gravam bytes em um arquivo.
fos = new FileOutputStream(this.caminho);// se o caminho n existir ele sera criado
fos.write(this.arquivo);// salva o arquivo passado no parametro
fos.close();
} catch (Exception ex) {
System.out.println(ex);
}
}
}
AnimalBeam
@ManagedBean(name="animalBean")
@RequestScoped
public class AnimalBean {
private Animal animal = new Animal();
private List<Animal> animais;
private EnumSexo[] sexo;
private EnumPorte[] porte;
private EnumTipo[] tipo;
private Map<Integer, Boolean> selecionados = new HashMap<Integer, Boolean>();
FacesContext contexto = FacesContext.getCurrentInstance();
FacesMessage mensagem = null;
.
.
Getters Setters
.
.
//Actions
public String salvar(){
AnimalRN animalrn = new AnimalRN();
//apagar apos os testes, pois este parametro deverá ser o usuário logado.
Empresa empresa = new Empresa();
empresa.setId_empresa(1);
this.animal.setEmpresa(empresa);
@SuppressWarnings("unchecked")
List<UploadArquivo> arquivos = (List<UploadArquivo>) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("listaobjUpload");
FotoRN fotoRN = new FotoRN();
if(arquivos.size() >= 1){
for (UploadArquivo arquivo: arquivos) {
Foto foto = new Foto();
foto.setAnimal(animal);
foto.setNome(arquivo.getNome());
fotoRN.salvar(foto);
arquivo.gravar();
}
}
animalrn.salvar(this.animal);
this.animal = new Animal();
mensagem = new FacesMessage("Cadastrado com sucesso!");
contexto.addMessage(null, mensagem);
return "ListaAnimais";
}
}
Deste jeito ate funciona mas não consegui limpar a lista com as fotos a serem upadas, de forma que ao add uma foto nova ele insere as fotos que estavam na lista
qualquer ajuda será bem vinda…
resolvi limpando a criando uma nova instancia da lista ao carregar a página, mesmo assim creio que deve ter um outro jeito de se fazer upload de varias imagens sem fazer esta gambiarra, e se alguém quiser contribuir ficarei grato.