Vraptor upload de multiplos arquivos nao funciona [RESOLVIDO]

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:

  1. 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:

  1. 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 :slight_smile: 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 :slight_smile:

se vc tivesse postado a exception do converter eu já tinha dito isso logo de cara :wink:

as “Caused by” e “root cause” geralmente são bem importantes para entender o erro.

continue postando dúvidas, que a gente ajuda =)