Pessoal, não estou conseguindo fazer upload de multiplos arquivos com o VRaptor 3.5.1.
Procurei no Google, e me parece que este problema já tinha sido resolvido, alguém tinha submetido a melhoria faz alguns anos até.
Eis o meus form:
<form action="<c:url value='/create'/>" method="post" enctype="multipart/form-data">
<input type="file" id="files" name="files[]" multiple /><br/>
<input type="submit" value="Entrar" />
</form>
Eis o meu metodo:
@Post
public void create(UploadedFile[] files) {
for(UploadedFile file: files){
System.out.println(file.getFileName());
}
}
Se eu tento fazer o upload de um arquivo apenas, funciona perfeitamente. Mas o multiple não funciona, seja um array ou uma List.
Eis a exceção;
/** ... **/
Exception when trying to instantiate Target(name=files, type=class [Lbr.com.caelum.vraptor.interceptor.multipart.UploadedFile;)
Caused by:
br.com.caelum.vraptor.http.InvalidParameterException: Exception when trying to instantiate Target(name=files, type=class [Lbr.com.caelum.vraptor.interceptor.multipart.UploadedFile
/** ... **/
Alguém tem alguma ideia do que seja?
troque de UploadedFile[] para List
Cara, nem com o List files tah funcionando.
Só funciona se for um arquivo apenas.
Lucas,
Eu também cheguei a conferir se o problema era o tamanho dos arquivos, mas não era viu. Os testes que tenho feito são com imagens pequenas, de 10kb no máximo cada.
Eu tenho subir duas, três…
Quando o arquivo é muito grande, o VRaptor barra, então ao menos neste ponto está tudo ok. O problema tá com mais de uma.
Tenho no meu classpath servlet-3, commons-io e commons-fileupload. Já tentei tirar só a Servlet e deixar só os commons, mas o problema persiste.
tenta tirar os colchetes e deixar o List<…>
Eu fiz dois testes:
- Apenas alterei o método e retirei os colchetes de List:
public void create(List files)
mas ele não consegue fazer a conversão:
- Alterei o campo “name” no input, retirando as chaves, e mantive a assinatura do método como a acima:
<input type="file" id="files" name="files" multiple/>
mas ele não conseguiu fazer o parse:
não entendi o que vc quis dizer… vc deixou como name=“files” e recebeu um List files?
Primeiro testei assim: “name=files[]” e no método “List files”. Não funcionou.
Depois eu deixei com “name=files” (antes estava name=“files[]”) e deixei o método como (List files). Esse segundo teste também não funcionou.
Tô pensando em fazer um Downgrade pro Vraptor 3.4, porque tava lendo e o pessoal conseguiu receber multiplos arquivos. Não sei se alguém já tentou fazer isso
no 3.5. De repente é alguma coisa que precisa ser corrigida. Eu realmente não queria ter que utilizar o uploadfy, não quero javascript envolvido nisso rsrs Vou tentar ver aqui.
Tava dando uma olhada, havia uma issue no Github que acabou virando uma feature nova pro vRaptor 3.4.
A solução encontrada na época foi arrumar o interceptor pras requisições multiple. De repente eu vou ter que escrever esse Interceptor na mão pra meu upload múltiplo funcionar.
To achando estranho pra caramba não estar funcionado aqui . . .
(ps: to editando as coisas aqui mesmo nesse comentario pra eu nao floodar o topico)
Nada ainda. O DefaultConverters não acha o parâmetro quando ele vem em um array, lista ou varargs.
A única maneira de receber uma lista ou um array no vraptor é se especificar o index no name. Por exemplo:
minha pagina:
<input type="text" name="pessoas[0].nome"/>
<input type="text" name="pessoas[1].nome"/>
meu controller:
public void addPessoa(List<Pessoa> pessoas){
}
O exemplo acima também é válido pra arquivos: files[0], files[1] etc…
No momento, se eu quiser passar vários arquivos de uma vez, o nome do indentificador com colchetes sem índices (“files[]”) não tá rolando. O negócio é fazer
do jeito antigo, deixar igual ao do orkut mesmo hahahaha
o erro do Unable to find converter for br.com.caelum.vraptor.interceptor.multipart.UploadedFile
é um bug da versão 3.5.1, para resolvê-lo é só colocar esse converter na sua aplicação:
https://github.com/caelum/vraptor/blob/master/vraptor-core/src/main/java/br/com/caelum/vraptor/converter/UploadedFileConverter.java
listas sem índice deveriam funcionar sim:
<input type="text" name="pessoas[].nome"/>
<input type="text" name="pessoas[].nome"/>
vc só é obrigado a colocar o índice se vc for agrupar vários atributos.
E sobre o fix que vc falou, ele tá no master, então está presente na versão 3.5.1
se o erro que estava dando era o do converter, é só acrescentá-lo.
Lucas,
Adicionei o converter e funcionou maravilhosamente bem. Ontem, antes de ir dormir, eu verifiquei que o fix já estava presente. Por isso eu tava achando estranho. Mas pro upload de múltiplos arquivos, é só adicionar esse convert que você passou que vai funcionar bem pra caramba.
Então, se alguém quiser fazer o upload de arquivos utilizado a tag multiple, fica assim:
No form:
<input type="file" name="files[]" multiple/>
No Controller:
public void meuMetodo(List<UploadedFile> files) {
//Seu codigo aqui
}
E vai funfar que eh uma beleza, sem um monte de inputs no form, sem javascript pra fazer gambiarra.
Lucas, muito obrigado pela ajuda cara
se vc tivesse postado a exception do converter eu já tinha dito isso logo de cara
as “Caused by” e “root cause” geralmente são bem importantes para entender o erro.
continue postando dúvidas, que a gente ajuda =)