Vraptor 2 - Aumentar tamanho do Upload

26 respostas
atayde

Gostaria de saber onde configuro para aumentar o tamanho do arquivo para upload. Hoje o tamanho máximo é de 2MB.
Li toda documentação e a unica coisa que achei, que pode ser configurada, mas não falam onde.

“Note: The upload file size is automatically limited to 2.000.000 bytes by VRaptor (and will be configurable in the feature).”

Estou usando o Vraptor 2.6.0

Grato,

Luiz Atayde

26 Respostas

RogerGales

A mensagem está dizendo que o tamanho é fixo e que em versões futuras se terá a opção de customizar o tamanho. É assim que eu a entendo.

atayde

RogerGales:
A mensagem está dizendo que o tamanho é fixo e que em versões futuras se terá a opção de customizar o tamanho. É assim que eu a entendo.

OK. E tem uma versão futura, que faça isso? Sem ser a versão 3?
Não tem como alterar este parâmetro?

RogerGales

Isso eu não sei te responder, sou iniciante no VRaptor.

atayde

Mas pelo que entendi, lendo novamente o NOTE, tem como configurar esta opção. Não seria apenas na futura versão.
Vamos aguardar.
Valeu.

Guevara

Para aumentar o tamanho é só fazer um component:

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

Multiplique o tamanho que vc quer por 1024, eu queria no máximo em 200KB ai ficou 204800.
Abraço!

Reparei que vc está usando versão antiga, ai já não sei se vai funcionar.

atayde

Imaginei. Pois não encontrei a classe ou interfase DefaultMultipartConfig.
Valeu!!!

Guevara:
Para aumentar o tamanho é só fazer um component:

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

Multiplique o tamanho que vc quer por 1024, eu queria no máximo em 200KB ai ficou 204800.
Abraço!

Reparei que vc está usando versão antiga, ai já não sei se vai funcionar.

Lucas_Cavalcanti

não tenho certeza, mas tem algo a ver com o vraptor.xml…

algum motivo especial pra não usar o VRaptor 3?

atayde

Sim. Já estou com o sistema todo completo e só preciso mudar o caso de uso para fazer upload de arquivos acima de 2mb.
Será que não tem uma solução para este problema? Quem poderia me falar sobre este vraptor.xml?
Valeu

Lucas Cavalcanti:
não tenho certeza, mas tem algo a ver com o vraptor.xml…

algum motivo especial pra não usar o VRaptor 3?

Lucas_Cavalcanti

tenta procurar aqui:
http://vraptor.caelum.com.br/vraptor2/

atayde

Já procurei tudo. Só encontrei o NOTE, falando que poder ser configurado. E o http://vraptor.caelum.com.br/vraptor2/vraptor-xml.html não fala nada!!!
Não sei mais o que fazer.

Lucas Cavalcanti:
tenta procurar aqui:
http://vraptor.caelum.com.br/vraptor2/

renanpto

O problema é que esse limite esta fixo na classe MultipartRequestInterceptor, o valor é setado no construtor da classe.

Voce pode tentar criar uma nova classe com a mesma logica e use uma outra forma de setar esse limite, apos isso declare essa classe no seu logic (ela é um interceptor).
detalhe: não sei se o upload irá funcionar, pois não conheco a fundo como framework trata essa questao do upload.

Boa sorte

Lavieri

solução:

adiciona esta classe ao seu projeto: => SizableMultipartRequestInterceptor

Observação… Configuration.getInstance(), no meu projeto retorna uma instancia singleton do objeto Configuuration … esse objeto lê suas propriedades de um .properties

no meu properties esta definido o size limit, que então passo para a instnacia do interceptor…

se você quizer, você pode alterar direto o valor, mas ai neste caso, sempre que precisar aumentar o valor, vai ter que recompilar, é por isso que prefiro um .properties.

a outra modificação que você terá que fazer é trocar

@InterceptBy(MultipartRequestInterceptor.class)

por

@InterceptBy(SizableMultipartRequestInterceptor.class)
ricardosoares

“Note: The upload file size is automatically limited to 2.000.000 bytes by VRaptor (and will be configurable in the feature).”

RogerGales:
A mensagem está dizendo que o tamanho é fixo e que em versões futuras se terá a opção de customizar o tamanho. É assim que eu a entendo.

só uma coisa: feature, nada tem a ver com futuro (future) !

renanpto

Lavieri:
solução

http://pastebin.com/EGSdEYgf

Observação… Configuration.getInstance(), no meu projeto retorna uma instancia singleton do objeto Configuuration … esse objeto lê suas propriedades de um .properties

no meu properties esta definido o size limit, que então passo para a instnacia do interceptor…

se você quizer, você pode alterar direto o valor, mas ai neste caso, sempre que precisar aumentar o valor, vai ter que recompilar, é por isso que prefiro um .properties.

a outra modificação que você terá que fazer é trocar

@InterceptBy(MultipartRequestInterceptor.class)

por

@InterceptBy(SizableMultipartRequestInterceptor.class)</blockquote>

Essa é a implementação da idéia que comentei no post anterior =D

Entao funciona. :lol:

Lavieri

renanpto:
Essa é a implementação da idéia que comentei no post anterior =D

Entao funciona. :lol:

sim, funciona, é assim que tem q fazer para corrigir o problema…

atayde

Lavieri,

Obrigado pela ajuda. Estou ficando louco com isso, pois está atrasando a entrega do projeto.

Fiz a opção de criar a classe SizableMultipartRequestInterceptor. Mas ela está dando pau na compilação.
Será que tem outra versão mais nova do vraptor, que resolva os problemas? Estou usando a 2.6.0

Os erros de compilação da classe SizableMultipartRequestInterceptor, são:

  • O método ‘public MultipartRequestInterceptor()’ declaração invalida, não retorna nada. Acredito que seja void.
  • Não pode acessar temporaryDirectory e sizeLimit. Acredito que eles não podem ser final.
  • Não é possível encontrar o método: Configuration.getInstance()

E se eu quiser alterar o valor diretamente, teria que ter o código fonte do vraptor, certo? Onde conseguiria ou teria que pedir para alguém gerar?
Se for possível, já coloca 64MB.

Valeu!!!

Lavieri:
solução:

adiciona esta classe ao seu projeto: => SizableMultipartRequestInterceptor

Observação… Configuration.getInstance(), no meu projeto retorna uma instancia singleton do objeto Configuuration … esse objeto lê suas propriedades de um .properties

no meu properties esta definido o size limit, que então passo para a instnacia do interceptor…

se você quizer, você pode alterar direto o valor, mas ai neste caso, sempre que precisar aumentar o valor, vai ter que recompilar, é por isso que prefiro um .properties.

a outra modificação que você terá que fazer é trocar

@InterceptBy(MultipartRequestInterceptor.class)

por

@InterceptBy(SizableMultipartRequestInterceptor.class)</blockquote>
Guevara

Se o projeto não for grande não rola fazer uma migração pro VRaptor 3? Ia pegar outros recursos bem legais:
http://vraptor.caelum.com.br/documentacao/migrando-do-vraptor2-para-o-vraptor3/

atayde

Pensei nisso, mas o projeto é grande, com 1 ano de desenvolvimento. Foi entregue e só deu problema nesta questão de upload.
Não seria viável e nem poderia gastar mais homens/horas para esta migração.

É só este bug que tenho que corrigir!!!

Guevara:
Se o projeto não for grande não rola fazer uma migração pro VRaptor 3? Ia pegar outros recursos bem legais:
http://vraptor.caelum.com.br/documentacao/migrando-do-vraptor2-para-o-vraptor3/

Lucas_Cavalcanti

esse é o construtor, troque pra public SizableMultipartRequestInterceptor

tire o final

ou crie o configuration, ou troque os usos dessas classes por valores fixos

atayde

Lucas,

Teve a manha total!!! Conseguiu resolver meu problema, funcionou perfeitamente.
Só uma duvida. No construtor 'new DiskFileItemFactory(4096 * 16, this.temporaryDirectory)'
Este valor 4096 * 16, deixo como está ou coloco o mesmo valor do tamanho maximo do arquivo?

Muito obrigado mesmo!!!
Valeu

Lucas Cavalcanti:

  • O método ‘public MultipartRequestInterceptor()’ declaração invalida, não retorna nada. Acredito que seja void.

esse é o construtor, troque pra public SizableMultipartRequestInterceptor

tire o final

ou crie o configuration, ou troque os usos dessas classes por valores fixos

Lavieri
atayde:
Lavieri,

Obrigado pela ajuda. Estou ficando louco com isso, pois está atrasando a entrega do projeto.

Fiz a opção de criar a classe SizableMultipartRequestInterceptor. Mas ela está dando pau na compilação.
Será que tem outra versão mais nova do vraptor, que resolva os problemas? Estou usando a 2.6.0

Os erros de compilação da classe SizableMultipartRequestInterceptor, são:
- O método 'public MultipartRequestInterceptor()' declaração invalida, não retorna nada. Acredito que seja void.
- Não pode acessar temporaryDirectory e sizeLimit. Acredito que eles não podem ser final.
- Não é possível encontrar o método: Configuration.getInstance()

E se eu quiser alterar o valor diretamente, teria que ter o código fonte do vraptor, certo? Onde conseguiria ou teria que pedir para alguém gerar?
Se for possível, já coloca 64MB.

Valeu!!!

Codigo fonte complet => http://pastebin.com/7RS6PHGq

public SizableMultipartRequestInterceptor() throws IOException {
		//Configuration.getInstance() retorna uma instancia q tem o upload size limit configurado.
                //this.sizeLimit = Configuration.getInstance().getUploadSizeLimit();
                this.sizeLimit = 1024 * 64 //neste caso 64 megas.
                
		
		// this directory must be configurable through the properties
		this.temporaryDirectory = File.createTempFile(&quot;raptor.&quot;, &quot;.upload&quot;).getParentFile();
	}

você pode colocar esse construtor ai de cima... o problema de fazer assim, é que caso você queria alterar o valor para 120mb no futuro, tera que abrir essa classe recompliar, jogar o .class pro seu projeto, e dar deploy novamente...

quando você coloca em um arquivo fora do seu projeto, em um .properties vc pode modificar ele mais fácil, mudando o .properties, e depois dando um restart na aplicação.

massssss, se apenas quer mudar o valor, use esse arquivo que passei

IMPORTANTE!!!

não esqueça de trocar os @InterceptBy() do antigo MultipartRequestInterceptor para o nome SizableMultipartRequestInterceptor

Dica: para encontrar onde tem referencia ao MultipartRequestInterceptor no seu projeto basta dar dois cliques no nome da classe, para que ela fique marca, e aperatar "CTRL + SHITF + G", ou clique com direito e peça para buscar Referencias

Mr_Arthur

Pessoal,

Estou tentando fazer um upload multiplo de imagens, porém estou tendo problemas com isso.

Método da minha Controller que recebe as imagens:

@Post
@Path("/produtos/{produto.id}/imagem")
public void upload(Produto produto, final List<UploadedFile> imagem) {
	... lógica aqui ...
}

Formulario de envio de imagens: (dinamicamente, eu posso adicionar mais imagens.)

<form action="<c:url value="/produtos/${produto.id }/imagem"/>" method="POST" enctype="multipart/form-data">
	<fieldset>
		<legend>Upload de Imagem</legend>
		<table id="tblUpload">
			<tbody>
				<tr>
					<td><input type="button" name="addOutraImg" value="Adicionar outra imagem" onclick="adicionaOutraImagem();" /></td>
				</tr>
				<tr>
					<td><input type="file" name="imagem[0]" /></td>
				</tr>
				<tr>
					<td><button type="submit">Enviar</button></td>
				</tr>
			</tbody>
		</table>
	</fieldset>
</form>

Cheguei a conclusão de que a soma do tamanho dos arquivos está influenciando, pois quando mando 3 imagens grandes (soma 2mb) o erro me é lançado.
Porém quando mando 6 imagens pequenas (soma 1,5mb) o upload é feito normalmente.
Segue a pilha de erro que aparece no browser, que não tem nenhuma mensagem relacionada a tamanho:

java.util.MissingResourceException: Can't find bundle for base name messages, locale pt_BR
	java.util.ResourceBundle.throwMissingResourceException(Unknown Source)
	java.util.ResourceBundle.getBundleImpl(Unknown Source)
	java.util.ResourceBundle.getBundle(Unknown Source)
	br.com.caelum.vraptor.validator.Validations.<init>(Validations.java:57)
	br.com.caelum.vraptor.interceptor.multipart.CommonsUploadMultipartInterceptor$1.<init>(CommonsUploadMultipartInterceptor.java:89)
	br.com.caelum.vraptor.interceptor.multipart.CommonsUploadMultipartInterceptor.intercept(CommonsUploadMultipartInterceptor.java:89)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)

Obrigado desde já,

Arthur Carvalho.

Lucas_Cavalcanti

cria um arquivo vazio chamado messages.properties na sua pasta src

Mr_Arthur

Aê Lucas, valeu cara. O erro agora mudou.
Estou conseguindo fazer upload dos meus arquivos ainda, porém quando eu excedo o limite de quase 2mb estou obtendo um NullPointerException.
A requisição está chegando no método da minha controller, porém com a List vazia, null...
Quando uso poucos arquivos (média de 1,5mb) consigo fazer upload normalmente.
Já tentei fazer como disseram nos posts anteriores sobre extender a classe DefaultMultipartConfig e sobrescrever o método getSizeLimit(), porém o erro continua (só que acontece para todo arquivo que tento fazer upload) e creio que não seja essa a solução para o problema.

br.com.caelum.vraptor.InterceptionException: an exception was raised while executing resource method
	br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:86)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:86)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
	br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:81)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.multipart.CommonsUploadMultipartInterceptor.intercept(CommonsUploadMultipartInterceptor.java:102)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)

root cause

java.lang.NullPointerException
	br.com.caelum.goodbuy.controller.ImagensController.upload(ImagensController.java:31)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	java.lang.reflect.Method.invoke(Unknown Source)
	br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:57)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:86)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
	br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:81)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.multipart.CommonsUploadMultipartInterceptor.intercept(CommonsUploadMultipartInterceptor.java:102)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)

Obrigado, novamente.

Arthur Carvalho

Lucas_Cavalcanti

qdo o upload for maior do q o limite, o VRaptor vai adicionar um erro de validação e passar null pra todos os parâmetros do seu método…

o ideal é vc colocar no começo do seu método de upload:

validator.onErrorXXXX
Mr_Arthur

Humm…
Problema resolvido.

Comecei com o VRaptor 3 à pouco e estou bastante satisfeito.

Lucas, muito obrigado aí pela paciência.

Att,

Arthur Carvalho

Criado 13 de setembro de 2010
Ultima resposta 17 de set. de 2010
Respostas 26
Participantes 8