[Resolvido] Limitar tamanho do Upload com VRaptor 3

10 respostas
Guevara

Oi pessoal!
Como faço para limitar tamanho máximo do upload em 200K?
Tava pensando em colocar lá no validator mesmo, algo do tipo:
Criando a classe CustomMultipartConfig para sobrescrever:

@Component
@ApplicationScoped
public class CustomMultipartConfig extends DefaultMultipartConfig {
	public long getSizeLimit() {
		return 200;
	}
}

E na jsp:

that(imagem > customMultipartConfig.getSizeLimit()),  "imagem", "tamanho.limite");

Só que em imagem, não tenho como pegar o tamanho do arquivo, não têm um getFileSize() lá, senão pegava com imagem.getFileSize().
Abraço!

10 Respostas

G

Guevara, quanto tempo?! :smiley:

O componente que você sobrescreveu está correto, é assim mesmo. Porém a validação não é feita no JSP nem mesmo via validator você consegue. Isso porque você só conhece o tamanho do arquivo após o fim do upload.

O componente do Vraptor que faz upload já faz a validação para você, e adiciona a mensagem de tamanho excedido no objeto Validator.

[complementando] Ou seja, basta você apenas sobrecrever o MultipartConfig e deixar o Vraptor fazer a validação.

Guevara

E ai Garcia! \o/
Então, tirei aquela validação na jsp, criei a classe CustomMultipartConfig e ao fazer upload dá este erro:

java.lang.NullPointerException
	br.com.imobiliaria.controller.FotoController$1.<init>(FotoController.java:58)
	br.com.imobiliaria.controller.FotoController.upload(FotoController.java:53)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	java.lang.reflect.Method.invoke(Method.java:597)

A linha 58 em FotoController é esta:

that(!foto.getNome().isEmpty(), "img.nome",
					"imgNome.obrigatorio");

Mas sem a classe CustomMultipartConfig o validator funciona corretamente, precisa fazer algo mais pra fazer o VRaptor usar a nova classe ou ele se vira pra usá-la?
Abraço!!

Lucas_Cavalcanti

o getSizeLimit tem que retornar o limite em bytes… ou seja, se vc quiser 200KB vc tem que retornar 200*1024…

se estourar o limite, o vraptor vai adicionar um erro de validação, e todos os parâmetros da sua lógica vão vir nulos. Então a primeira linha do seu método de upload tem que ser algo do tipo:

validator.onErrorRedirectTo(...)...

depois vc pode fazer as outras validações normalmente

Guevara

Valeu Lucas! :smiley:
Como personalizo aquela mensagem que ele mostra?

???file.limit.exceeded???
Guevara

Ops, fui por analogia e descobri, é só adicionar ao messages.properties:

file.limit.exceeded = O arquivo possui mais de 200KB, selecione uma imagem com tamanho inferior

Valeu!!!
Abraço!

G

Lucas, posso melhorar essa parte da documentação sobre download e upload? Abri uma issue lá no github há algum tempo.

Lucas_Cavalcanti

Claro, garcia-jj, não precisa nem perguntar :wink:
só me avisa via pull request depois

Abraços

G

Fiz um pull no branch docs do meu fork: http://github.com/garcia-jj/vraptor/commit/4edfb799fb8d60a5b4e1a6da66011c5a2652673c

Rapaz… que zona estava meu fork, mas acho que agora eu consegui resolver todos os conflitos. Tive de fazer alguns commits no master para resolver esses problemas no merge.

Valeu pelo help :stuck_out_tongue:

A

Lucas Cavalcanti:
o getSizeLimit tem que retornar o limite em bytes… ou seja, se vc quiser 200KB vc tem que retornar 200*1024…

se estourar o limite, o vraptor vai adicionar um erro de validação, e todos os parâmetros da sua lógica vão vir nulos. Então a primeira linha do seu método de upload tem que ser algo do tipo:

validator.onErrorRedirectTo(...)...

depois vc pode fazer as outras validações normalmente

É possivel configurar para que os demais parametros da logica passados não venham nulos?
Preciso do codigo do movimento para redirecionar novamente para o formulario de edicão.
O há outro meio.?

public void adiciona(Movimento movimento, final List<UploadedFile> arquivos) {
validator.onErrorRedirectTo(this).formulario(movimento.getProcesso()); // na primeira linha para se vier arquivo maior do que deveria.
}
@Get("movimentos/{processo.id}/novo")
public void formulario(Processo processo) {
    Processo buscado = processoDao.carregaPorId(processo.getId());
    result.include("processo", buscado);
 }
Lucas_Cavalcanti

não dá pra preencher os outros dados se o upload for grande demais… isso pq os outros dados vem junto com o upload.

o ideal é fazer um form separado que só faça o upload

Criado 22 de agosto de 2010
Ultima resposta 21 de abr. de 2011
Respostas 10
Participantes 4