Vraptor3: file upload com streaming

2 respostas
G

Terminando minha fase de migração de minha aplicação para vraptor3, analisei bem o componente para file upload, que usa o commons-fileupload como backend.

Em minha aplicação antiga, que usava struts 1.3.x eu usava a API de streaming do commons-fileupload. Segundo os desenvolvedores do projeto isso permite uma melhor performance. Não fiz os testes reais, porém faz sentido uma vez que você trabalha com streamings ao invés de I/O em disco.

Notei que o componente para uploading do vraptor usa DiskFileItemFactory. Então para brincar um pouco resolvi fazer uns testes escrevendo um componente para usar o streaming ao invés de disco. Até aqui tudo bem, ficou super simples. Porém me deparei quando ao método FileUpload.file, que me retorna um stream. Quando uso streaming, a cada laço que faço para pegar os arquivos/campos da tela o FileItemIterator.hasNext faz um close dos streams anteriores, sendo assim não consigo armazenar o stream nesse objeto, aliás, consigo armazenar, porém ao ler o mesmo já está finalizado, pois internamente o FileItemIterator faz isso.

Como a abordagem de vocês do vraptor foi de usar InputStream, pergunto porque não byte[]? Há alguma melhora na performance usando stream? Há alguma forma de eu, nesse meu caso, poder contornar a situação e retornar um stream? Pelo menos não conheço na API do I/O para criar um InputStream a partir de outro.

E aproveitando, vocês já usaram streaming no fileupload? Será que realmente haverá algum ganho de performance que possa valer a pena?

Abraços

2 Respostas

Lucas_Cavalcanti

Ao usar byte[] o arquivo inteiro precisa estar na memória… usando InputStream, você pode ter arquivos maiores que não precisam estar todos na memória, podem estar vindo aos poucos da rede…

o ganho de performance é esse: se você não usar streamming, você tem que fazer o upload do arquivo inteiro, colocar na memória ou gravar no disco, e só então processá-lo…

com o InputStream você pode ir processando o arquivo à medida que ele está sendo uploadado…

o fileUpload está usando streamming pra arquivos menores que 2Mb por padrão, a partir disso ele grava no disco, mas você pode sobrescrever essa configuração

G

Lucas, muito obrigado. Explicação mais do que convincente para eu achar que não vale a pena usar o streaming do commons-fileupload.

Complementando aqui uma dica: meu diretório /tmp está mapeado em memória, assim todos os arquivos temporários estão na verdade na memória ram, que é muito mais rápido acesso do que em disco. Como hoje em dia é normal você ter micros com 4G…

Abraços

Criado 29 de outubro de 2009
Ultima resposta 29 de out. de 2009
Respostas 2
Participantes 2