Vraptor + Upload Multiplo + HTML5

16 respostas
david.cs20

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
@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();
		}
	}
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
@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);
	}

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

16 Respostas

Lucas_Cavalcanti

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/

david.cs20

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.

Lucas_Cavalcanti

tentou isso?

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

(tinha esquecido os colchetes =S)

david.cs20

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.

Lucas_Cavalcanti

só uma dúvida:

funciona pra um arquivo só?

david.cs20

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

@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();
		}
}
Lucas_Cavalcanti

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

david.cs20

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

Lucas_Cavalcanti

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.

Lucas_Cavalcanti

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.

david.cs20
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;
@Path("/well/{well.name}/uploadFile2")
	@Post
	public void uploadFile2(Well well, List&lt;UploadedFile&gt; Filedata, String modulo,
			String pasta, String destino) {
		
		System.out.println(Filedata);
}
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.
Lucas_Cavalcanti

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

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

david.cs20

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

Por isso mantive o @Path

Lucas_Cavalcanti

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.

david.cs20

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

Lucas_Cavalcanti

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.

Criado 1 de outubro de 2013
Ultima resposta 9 de out. de 2013
Respostas 16
Participantes 2