Baseado no teu código fiz um fix para o upload do servlet3 (componente que é baseado no que você usou para commons-fileupload).
Incluí o atributo de classe:
Incluí o seguinte método privado para fixar o nome.
private String fixIndexedParameters(String name) {
if (name.contains("[]")) {
String newName = name.replace("[]", "[" + (indexes.count(name)) + "]");
indexes.add(name);
logger.debug("{} was renamed to {}", name, newName);
name = newName;
}
return name;
}
Depois é só adicionar a chamada para este método lá onde você pega o nome do parametro. No caso do componente para servlet 3 ficou assim:
String name = part.getName();
name = fixIndexedParameters(name);
Fiz uns testes com esse HTML e controller abaixo e tudo funcionou bem. Veja se isso te ajuda.
[code]
<input type="submit" /> <br />
</form>[/code]
[code] @Post("/upload")
public void upload(UploadedFile[] files, String[] comments, String text) {
for (UploadedFile file : files) {
System.out.println(file);
}
for (String comment : comments) {
System.out.println(comment);
}
System.out.println(text);
}[/code]
O código é bem trivial e fácil de entender. A única coisa mais complexa é o Multiset, do Guava Libraries, que é um “Bag Set” que permite adicionar vários elementos e depois contar quantos elementos iguais eu tenho. Assim facilita o contador, que pelo que notei pelos pull-requests no Github, era o problema que você tinha.
Estou passando pelo mesmo cenario, mas nao estou conseguindo fazer esse troço funcionar. Por gentileza, vejam:
JSP:
<input type="file" name="files[]" multiple />
Controller:
@Post
public void upload(List<UploadedFile> files){
}
Exception:
Caused by: br.com.caelum.iogi.exceptions.InvalidTypeException: Cannot instantiate abstract type interface br.com.caelum.vraptor.interceptor.multipart.UploadedFile
at br.com.caelum.iogi.ObjectInstantiator.expectingAConcreteTarget(ObjectInstantiator.java:40)
at br.com.caelum.iogi.ObjectInstantiator.instantiate(ObjectInstantiator.java:26)
at br.com.caelum.iogi.MultiInstantiator.instantiate(MultiInstantiator.java:20)
at br.com.caelum.vraptor.http.iogi.VRaptorInstantiator.instantiate(VRaptorInstantiator.java:85)
at br.com.caelum.iogi.collections.IndexedListInstantiator.instantiate(IndexedListInstantiator.java:34)
at br.com.caelum.iogi.collections.ListInstantiator.instantiate(ListInstantiator.java:25)
at br.com.caelum.iogi.collections.ListInstantiator.instantiate(ListInstantiator.java:10)
at br.com.caelum.vraptor.http.iogi.NullDecorator.instantiate(NullDecorator.java:25)
at br.com.caelum.iogi.MultiInstantiator.instantiate(MultiInstantiator.java:20)
at br.com.caelum.vraptor.http.iogi.VRaptorInstantiator.instantiate(VRaptorInstantiator.java:85)
... 59 more
Na hora de injetar o valor dos parametros o vraptor não está conseguindo encontrar o valor do parametro “files”, visto que o mesmo está na request com a chave “files[numero]”. Dessa forma ocorre a tentativa de instanciar o UploadedFile e o erro…
Conseguem enxergar algo que está errado? Me parece que está igual aos outros exemplos desse topico.