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>CadastrodeAnimais</h2><h:messagesstyle="color:red"/><h:formid="tipoAnimal"><h:inputHiddenvalue="#{animalBean.animal.id_animal}"/><h:panelGridcolumns="2"cellpadding="5"width="400"><p:outputLabelvalue="Nome: "for="nome"styleClass="label"/><p:inputTextid="nome"label="Nome"value="#{animalBean.animal.nome}"required="true"requiredMessage="O campo Nome deve ser informado!"size="35"maxlength="30"/><p:outputLabelvalue="Sexo:"for="nome"styleClass="label"/><p:selectOneRadioid="sexo"value="#{animalBean.animal.sexo}"required="true"requiredMessage="O campo Sexo deve ser informado!"><f:selectItemsvalue="#{animalBean.sexo}"var="sexo"itemValue="#{sexo.codigo}"itemLabel="#{sexo.descricao}"/></p:selectOneRadio><p:outputLabelvalue="Idade"for="idade"styleClass="label"/><p:inputTextid="idade"value="#{animalBean.animal.idade}"required="true"requiredMessage="O campo Idade deve ser informado!"/><p:outputLabelvalue="Descrição:"for="descricao"styleClass="label"/><p:inputTextareaid="descricao"value="#{animalBean.animal.descricao}"rows="7"cols="50"required="true"requiredMessage="O campo Descrição deve ser informado!"/><h:outputLabelvalue="Fotos:"for="foto"/><p:fileUploadid="foto"fileUploadListener="#{fotoBean.uploadAction}"multiple="true"mode="advanced"allowTypes="/(\.|\/)(gif|jpe?g|png)$/"required="true"/><h:outputText/><h:commandButtonvalue="Inserir"action="#{animalBean.salvar()}"/></h:panelGrid></h:form>
FotoBeam
@ManagedBean(name="fotoBean")@SessionScopedpublicclassFotoBean{privateFotofoto=newFoto();privateList<String>lista=newArrayList<String>();privateList<UploadArquivo>lista_arquivos=newArrayList<UploadArquivo>();privateUploadArquivoarquivo;publicFotogetFoto(){returnfoto;}publicvoidsetFoto(Fotofoto){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 listapublicvoiduploadAction(FileUploadEventevent){this.arquivo=newUploadArquivo();this.arquivo.fileUpload(event,"/resources/img/");this.lista_arquivos.add(arquivo);FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("listaobjUpload",lista_arquivos);}}
Upload arquivos
publicclassUploadArquivo{privateStringcaminho;privatebyte[]arquivo;privateStringnome;publicStringgetNome(){returnnome;}publicStringgetRealPath(){FacesContextaFacesContext=FacesContext.getCurrentInstance();ServletContextcontext=(ServletContext)aFacesContext.getExternalContext().getContext();returncontext.getRealPath("/");}publicvoidfileUpload(FileUploadEventevent,Stringdiretorio){try{this.nome=event.getFile().getFileName();this.caminho=getRealPath()+diretorio+getNome();this.arquivo=event.getFile().getContents();Filefile=newFile(getRealPath()+diretorio);file.mkdirs();}catch(Exceptionex){System.out.println("Erro no upload do arquivo"+ex);}}publicvoidgravar(){try{FileOutputStreamfos;// FileOutputStream gravam bytes em um arquivo.fos=newFileOutputStream(this.caminho);// se o caminho n existir ele sera criadofos.write(this.arquivo);// salva o arquivo passado no parametrofos.close();}catch(Exceptionex){System.out.println(ex);}}}
AnimalBeam
@ManagedBean(name="animalBean")@RequestScopedpublicclassAnimalBean{privateAnimalanimal=newAnimal();privateList<Animal>animais;privateEnumSexo[]sexo;privateEnumPorte[]porte;privateEnumTipo[]tipo;privateMap<Integer,Boolean>selecionados=newHashMap<Integer,Boolean>();FacesContextcontexto=FacesContext.getCurrentInstance();FacesMessagemensagem=null;..GettersSetters..//ActionspublicStringsalvar(){AnimalRNanimalrn=newAnimalRN();//apagar apos os testes, pois este parametro deverá ser o usuário logado.Empresaempresa=newEmpresa();empresa.setId_empresa(1);this.animal.setEmpresa(empresa);@SuppressWarnings("unchecked")List<UploadArquivo>arquivos=(List<UploadArquivo>)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("listaobjUpload");FotoRNfotoRN=newFotoRN();if(arquivos.size()>=1){for(UploadArquivoarquivo:arquivos){Fotofoto=newFoto();foto.setAnimal(animal);foto.setNome(arquivo.getNome());fotoRN.salvar(foto);arquivo.gravar();}}animalrn.salvar(this.animal);this.animal=newAnimal();mensagem=newFacesMessage("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
T
thayson.silva
qualquer ajuda será bem vinda…
T
thayson.silva
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.