Estou com problemas para fazer upload, no VRaptor 3, quando tenho um ou mais <select multiple… no mesmo form. Acredito que seja relacionado ao parâmetro enctype=“multipart/form-data”.
Fiz da forma que falou. O erro parou de ocorrer, mas o retorno esta
sendo sempre o último valor selecionado e não todos os valores
selecionados como deveria ser.
Att
Paulo_Silveira
oi bruno!
a requisicao é GET? pode mandar pra gente a URL que esta sendo gerada pelo form quando voce o submete?
Em ambos os casos chega null. Quando trabalho com String[] recebo os ids populados.
Qual a forma correta?
Lucas_Cavalcanti
com o vraptor padrão não dá pra fazer isso… a gente usa o ognl pra popular os parâmetros e ele não suporta isso…
vc tem duas opções: ou usar javascript pra colocar os índices antes de mandar a requisição, ou criar um interceptor que tenta ajustar esses parâmetros…
o do interceptor funcionaria assim (mais ou menos):
não foi implementado no vraptor ainda… mas vc pode usar o interceptor que eu mandei no último post
G
garcia-jj
Lucas, sei que esse na verdade não é um problema do vraptor, já que é o select-multiple que envia os dados diferente dos outros objetos. Mas há um impacto que colocar esse fix no core do vraptor? Se o problema é apenas com o OGNL será que dá para fazer um fix nas classes que integram o OGNL ao vraptor?
Nas minhas aplicações que fazem o uso de select-multiple atualmente estou fazendo isso via request.getParameter.
só colocar [] no nome do select, aonde fica a collection
G
garcia-jj
Mais rápido que a foice do ceifador sinistro, hahahha.
m0ska
Eu passei a noite toda com este problema, daí achei este snapshot aqui do vraptor e funcionou assim:
Eu dei o name do select name=“gruposId[]”
e na assinatura do método tive de fazer assim!
publicvoidsalvar(Long[]gruposId){...}
eu quiser usar string, ele tava dando erro de conversão.
publicvoidsalvar(String[]gruposId){...}
pra mim não é um problema, mas de repente pode ser para outras pessoas.
G
garcia-jj
m0ska, você tentou com List?
m0ska
testei com List funfou beleza
m0ska
Eu não sei se é possível, mas pra mim o ideal seria que se o name do select fosse assim: name=“fornecedor.grupos.id” ou algo parecido, ele já preencheria os ids dos grupos do fornecedor. Acho que é a solução mais elegante neste caso.
Lucas_Cavalcanti
basta nomeá-lo:
fornecedor.grupos[].id
m0ska
Funcionou, parabéns pela implementação, possibilita um código mais elegante
Só pra constar pra galera que tiver o mesmo problema no futuro.
Eu tinha uma classe fornecedor que por sua vez possuia uma coleção de grupos.
E precisava que o vraptor preenchesse automaticamente os valores dos grupos em um multiple selectbox.
public void editaPerfil(Usuario usuario, List<Perfil> combo){...
Esta chegando null a lista, porém se eu troco o combo[] por combo[0] e combo[1] chega o valor… tenho que alterar mais alguma coisa pra funcionar o combo[]?
Lucas_Cavalcanti
baixe o último snapshot do vraptor, isso (a notação combo[]) já está funcionando:
Onde noticia.editoria eh uma lista de Editoria editoria.id e um Integer.
Alguma sugestao ?
G
garcia-jj
Se você tem um noticia.editorias[].id, espera-se que seja um array/list. Portanto seu método deve receber List ou Noticia[], e não simplesmente Noticia.
Lucas_Cavalcanti
se existe um Noticia.setEditoriais(List) tb funciona, garcia…
esse erro chega a dar 500 ou só aparece no log?
tiagojco
Na verdade eh um List dentro do Noticia (noticia.editorias[].id)
Humm… me apressei ao informar isto como erro, fiquei sabendo de Lucas (thnks Tomaz Lavieri) que é só um log-> rethrow.
O problema que estava ocorrendo era em outro lugar (ja resolvi).
Lucas_Cavalcanti
na verdade é um silenciator mesmo (log de debug -> ignore)
como em produção vc não deveria deixar log de debug ligado, acho que não tem maiores problemas deixar assim
tiagojco
sim, saquei thnx…
a titulo de informacao o problema era que o bean tinha uma propriedade “editorias” que eh um Set, e eu achei q sobrescrevendo o metodo setEditorias(List ) e convertendo a lista para um set dentro dele resolveria, mas o OGNL na verdade usa o getter do editorias para enfiar o select multiple que foi passado da view no bean (noticia.getEditorias().set(X,bla)).
como o getter de editorias voltavam um Set, dava pAu
thnxz
edit: (emoticons oh the hell)
G
garcia-jj
Oops :oops:
rds2
Pessoal bom dia como eu faço pra percorrer uma lista de arquivos que vem do input, e exibir cada arquivo em uma linha?
A principio fiz da seguinte forma
vc quer exibir o que de cada arquivo? o nome? link pra download?
rds2
tenho um input file que vou faz\er o dowload multiplo, ai vi que ele separa cada url de arquivo por virgula , então eu precisaria percorrer e exibir o nome ou a url de cada arquivo apos a virgula tem que usar o split?
quero exibir o caminho dos arquivos
rds2
Assim eu vou precisar selecionar os arquivos pra upload, e exibir um em cada linha
Vc chegou a ver aquele outro topico? era so a versão do commons fileupload!! :shock:
Lucas_Cavalcanti
vi sim…
vc quer exibir o caminho dos arquivos na máquina do cara?
faça isso com algum plugin javascript, tipo o jquery uploadfy.
não dá pra fazer isso do lado do servidor (JSP), o caminho do arquivo não vai pra lá, só o nome dele vai (questão de segurança). Ou seja, só dá pra fazer isso via javascript, do lado do cliente.
rds2
Entendi… então como eu faço somente pra exibir o nome do arquivo na minha tela ,? porque o upload de um arquivo beleza eu consegui, do mesmo jeito que eu fiz aquele projeto da apostila, a diferença e´que preciso selecionar mais de um para fazer upload de uma vez so!
Lucas_Cavalcanti
sem problemas, só receber uma (List arquivos) no controller e usar o .getName() deles.
rds2
" Não consegui acessar o uploadfy é bloqueado aki vou baixar depois mas por enquanto te certo cara ?
@ComponentpublicclassArquivo{privateList<Arquivo>arquivos;publicList<Arquivo>getArquivos(){returnarquivos;}publicvoidsetArquivos(List<Arquivo>arquivos){this.arquivos=arquivos;}privateFiledirArquivos;publicArquivo(ServletContextcontext){//String caminhoImagens = context.getRealPath("C:/Imagens");dirArquivos=newFile("D:/arquivos");dirArquivos.mkdir();}publicvoidsalva(List<UploadedFile>arquivos)throwsIOException{for(UploadedFilearquivo:arquivos){Filedestino=newFile(dirArquivos,arquivo.getFileName()+".txt");try{destino.createNewFile();IOUtils.copyLarge(arquivo.getFile(),newFileOutputStream(destino));}catch(FileNotFoundExceptione){e.printStackTrace();thrownewFileNotFoundException("Arquivo não encontrado!");}catch(IOExceptione){e.printStackTrace();thrownewIOException("Não foi possivel enviar o arquivo!");}System.out.println("Passa por aki!!!");arquivo.getFile().close();}}}
Lucas_Cavalcanti
se não funcionou assim, não sei se vai funcionar… use o uploadify, que manda de um em um.
rds2
Era o jar da aplicação ja atualizei aki!! Obrigado meu amigo!!
rds2
Lucas bom dia ,
agora fico redondo meu projeto :lol: vlw mesmo!
So tenho uma duvida no meu metodo salva:
1° no metodo salva , o metodo “copyLarge()” no é para possibilitar o envio de arquivos maiores que 2gb?
porque estaou tentando fazer upload de arquivos .zip com tamanho de “362MB” e esta me renderizando a seguinte mensagem;
" org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (20411407) exceeds the configured maximum (2097152) "
como posso mudar isso?
publicvoidsalva(List<UploadedFile>arquivos)throwsIOException{for(UploadedFilearquivo:arquivos){Filedestino=newFile(dirArquivos,arquivo.getFileName());try{destino.createNewFile();IOUtils.copyLarge(arquivo.getFile(),newFileOutputStream(destino));}catch(FileNotFoundExceptione){e.printStackTrace();thrownewFileNotFoundException("Arquivo não encontrado!");}catch(IOExceptione){e.printStackTrace();thrownewIOException("Não foi possivel enviar o arquivo!");}System.out.println("Passa por aki!!!");arquivo.getFile().close();}}
seufagner
Lucas
Quanto o array ou a lista contém apenas um elemento o parâmetro vem vazio. Já vi em outra thread que este era um bug do VRaptor.
Isto foi corrigido? Lembro que você sugeriu uma abordagem para tal. Isto foi implementado?
Utilizar um sufixo “_array”, “Array”, “_list” ou “List” ficaria feio. Usar “[]” iria se resumir a Arrays.