Vraptor + Upload Multiplo + HTML5

Ola tenho um upload de um único arquivo que já funciona porem preciso transformar-lo em um upload múltiplo.

Codigo de upload arquivo unico [code]
@Path("/well/{well.name}/uploadFile21")
@Post
public void uploadFile21(Well well, final UploadedFile Filedata, String modulo,
String pasta, String destino) {
String path;

	if (pasta != null) {
		path = WellUtil.PATH_WELL + sep + modulo + pasta;
		System.out.println("teste upload se pasta diferente null" + path );
	} else {
		pasta = "";
		path = WellUtil.PATH_WELL + sep;
		System.out.println("teste upload se pasta = null" + path );
	}
	
	System.out.print( "\n\n" + path);
	
	Response response = new Response();
	response.setName(Filedata.getFileName());
	File file = new File(path, Filedata.getFileName());
	try {
		FileOutputStream os = new FileOutputStream(file);
		IOUtils.copyLarge(Filedata.getFile(), os);
		response.setMsg(I18nUtils.getText("arq_env_ok", wellUtil.getLang()));
		result.use(xml()).from(file).serialize();
	} catch (IOException e1) {
		String excecao = e1.getMessage();
		response.setMsg("Erro: " + excecao);
		result.use(xml()).from(file).serialize();
	}
}
[/code]

Form do JSP <form name="form_arquivo" id="form_arquivo" action="<c:url value='/well/{well.name}/uploadFile'/>" method="post" enctype="multipart/form-data"> <input id="inputFile" name="Filedata" type="file" class="inputFile" multiple/> </form>

Comecei a desenvolver pelas pesquisas que fiz mais estou meio travado como vou tratar essa lista de arquivos. Segue código abaixo [code]
@Path("/well/{well.name}/uploadFile2")
@Post
public void uploadFile2(Well well, final List<UploadedFile> Filedata, String modulo,
String pasta, String destino) {
String path;

	if (pasta != null) {
		path = WellUtil.PATH_WELL + sep + modulo + pasta;
		System.out.println("teste upload se pasta diferente null" + path );
	} else {
		pasta = "";
		path = WellUtil.PATH_WELL + sep;
		System.out.println("teste upload se pasta = null" + path );
	}
	
	System.out.print( "\n\n" + path);
}[/code]

Quem puder me da uma direção do que devo fazer desde já obrigado.

Tenta trocar para:

<input id="inputFile" name="Filedata" type="file" class="inputFile" multiple/>

Ou usar um plugin javascript como o uploadify
http://www.uploadify.com/

Testei o código acima e não funcionou não.
Mais e justamente o uploadify que estou tendo que retirar da aplicação e modificar para HTML5.

tentou isso?

<input id="inputFile" name="Filedata[]" type="file" class="inputFile" multiple/>  

(tinha esquecido os colchetes =S)

Atualmente meu Form esta da seguinte maneira:

&lt;form name="form_arquivo" id="form_arquivo" enctype="multipart/form-data"&gt; &lt;input id="inputFile" name="Filedata[]" type="file" class="inputFile" multiple/&gt; &lt;/form&gt;

mais ja testei os seguintes imputs:

&lt;input type="file" id="files" name="files[]" multiple /&gt; &lt;input id="inputFile" name="Filedata" size="150" type="file" class="inputFile" multiple/&gt;
Não sei se e necessário criar um javascript para passar esse array de dados.

só uma dúvida:

funciona pra um arquivo só?

Para um unico arquivo só funciona se no controller estiver da seguinte maneira:

[code] @Path("/well/{well.name}/uploadFile2")
@Post
public void uploadFile2(Well well, final UploadedFile Filedata, String modulo,
String pasta, String destino) {
String path;

	if (pasta != null) {
		path = WellUtil.PATH_WELL + sep + modulo + pasta;
		System.out.println("teste upload se pasta diferente null" + path );
	} else {
		pasta = "";
		path = WellUtil.PATH_WELL + sep;
		System.out.println("teste upload se pasta = null" + path );
	}
	
	System.out.print( "\n\n" + path);
	
	Response response = new Response();
	response.setName(Filedata.getFileName());
	File file = new File(path, Filedata.getFileName());
	try {
		FileOutputStream os = new FileOutputStream(file);
		IOUtils.copyLarge(Filedata.getFile(), os);
		response.setMsg(I18nUtils.getText("arq_env_ok", wellUtil.getLang()));
		result.use(xml()).from(file).serialize();
	} catch (IOException e1) {
		String excecao = e1.getMessage();
		response.setMsg("Erro: " + excecao);
		result.use(xml()).from(file).serialize();
	}

}[/code]

vc tá com o commons-fileupload no classpath ou tá usando o upload do servlet3?

Sim tenho a seguinte versão do commons-fileupload-1.2.2.jar no Classapath.

vou ver se eu consigo debugar hoje a noite pra ver pq não está funcionando…

se vc quiser adiantar as coisas, configure o source do VRaptor no eclipse e debugue essa classe:

ve o que acontece nesse pedaço de código que eu destaquei.

Testei aqui com a versão mais nova do VRaptor (3.5.3),
esse form:

<form action="${linkTo[UmController].teste }" method="post" enctype="multipart/form-data">
	<label>Upload
		<input type="file" name="files[]" multiple/>
	</label>
	<input type="submit"/>
</form>

e o controller:

@Resource
public class UmController {
	@Post("/testando")
	public void teste(List<UploadedFile> files) {
		System.out.println(files);
	}
}

E funcionou normalmente.

VRaptor 3.5.3 e commons-fileupload-1.2.1

Tenta usar essas versões, os colchetes após o nome e dá um toque se funcionar.

Fiz as modificações faladas

&lt;form action="${linkTo[WellController].uploadFile2}" method="post" enctype="multipart/form-data"&gt; &lt;label&gt;Upload &lt;input id="inputFile" type="file" name="Filedata[]" class="inputFile" multiple/&gt; &lt;/label&gt; &lt;input type="submit"/&gt; &lt;/form&gt;

[code] @Path("/well/{well.name}/uploadFile2")
@Post
public void uploadFile2(Well well, List<UploadedFile> Filedata, String modulo,
String pasta, String destino) {

	System.out.println(Filedata);

}[/code]

E agora estou tendo um erro 405
E no console a seguinte mensagem: 16:53:36,162 INFO [ResourceLookupInterceptor] Method POST is not allowed for requested URI. Allowed Methods are [GET]
Porem não posso usar a versão mais atual do sistema como você testou aqui estou tendo que utilizar a versão 3.1.2. não sei se isso pode esta interferindo.

engraçado… vc importou o @Post do VRaptor?

troque o @Path(“xxx”) @Post por @Post(“xxx”)

Tentei fazer isso mais ele dava a seguinte mensagem de erro no @Post(“xx”) :

Por isso mantive o @Path

então ou vc está com uma versão muito antiga do VRaptor (tipo 3.1) ou vc importou o @Post do pacote errado.

o import certo é de br.com.caelum.vraptor.Post.

Sim e uma versão antiga do Vraptor 3.1.2 . E infelizmente não posso modificar por decisões internas do projeto.

crie então uma classe igual a essa no seu projeto:

mas na declaração da classe faça:

public class MyMultipartInterceptor extends CommonsUploadMultipartInterceptor {...}

crie o construtor delegando pro super

se falhar a compilação de alguma coisa, copie as classes respectivas…

qualquer coisa dá um toque se não estiver conseguindo.