Upload de arquivos grandes [NÃO RESOLVIDO AINDA]

10 respostas
T

Olá,

Tenho uma aplicação flex/java que permite o upload de arquivos para o servidor. O problema é que esses arquivos podem ser grandes, acima de 2gbs. Quando envio arquivos maiores que 2gbs um erro ocorre, porem arquivos menores que isso funcionam corretamente. Sabe me dizer se tem alguma limitação no http 1.1, no brownser ou no servidor (jboss ou tomcat) relativo a isso? Tem como corrigir?

Obrigado!

10 Respostas

E

nunca vi esse erro, você tem o Log4j na sua aplicação? Se me lembro bem ele tem um maxfilesize… Se estiver usando o Mod_JK, pode ser que a restrição seja do apache.

T

Tenho o Log4J sim, porém não chega nada no meu servlet para exibir qualquer coisa. Fiz alguns testes, veja que estranho.
Achando que fosse algum problema no flex fiz um form html normal com enctype=“multipart/form-data” e o mesmo erro acontece. No caso do html ele até tenta enviar, mas passa algum tempo aparece uma pagina dizendo:

Firefox: Falha de carregamento da pagina.
IE: Problema de conetividade
Chrome: Return code : 1

Porem, se o arquivo for menor que 2gb funciona legal.

Achando que o problema fosse do java , fiz um upload de arquivo usando php e html. Mesmo problema.

Testei no jboss4, jboss5. tomcat e apache (no caso do php). Pesquisei por esse tipo de configuração que você falou mas nao consegui achar nada de concreto. Como posso determinar esse maxfilesize? Na sua experiencia você tentou upload de arquivos maiores que 2gbs?

Pelo que pesquisei sistemas 32bits so consegue no maximo 2*31-1 bit (justamente os aproximados 2gbs). Agora não sei onde o sistema ser 32bits influencia no browser, talvez seja alguma variavel definidade com um tipo erradamente. Alguem sabe mais sobre esse assunto?

Obrigado.

Obrigado.

E

Eu já consegui fazer upload de mais de 2GB em sistemas 64bits, não tentei em sistemas de 32bits. Mas acho que você [ou eu]se confundiu um pouco, o HTML independe da arquitetura do sistema operacional. Em sistemas x86 (32 bits) você pode mapear até 2^32 bytes, que resulta em 4GB. Em sistemas de arquivos Fat32, o tamanho máximo de arquivo é 4GB. Se me lembro bem, o tamanho máximo da requisição padrão é 4GB mesmo. Mas no PHP tem as configurações de UPLOAD_MAX_FILESIZE e POST_MAX_SIZE, não lembro mais onde era essa configuração no Apache, mas lembro que tinha algo semelhante.

Você usa proxy? Acredita que o proxy esteja filtrando os POST HTTP com mais que 2GB? Tentou colocar o MaxLenght no input file?

T

Segundo informações metade desse valor 2^32 são números negativos. Dai resulta em 2gbs.

No caso do php mesmo setando UPLOAD_MAX_FILESIZE e POST_MAX_SIZE não funcionou. Ainda sim, quando rodo no php <% echo ini_get(“upload_max_filesize”); %> exibiu um valor bem acima do que eu estou enviando. Agora, como eu poderia configurar isso no meu jboss ou no tomcat para poder usar meu servidor java?

Configurei tambem o MaxLenght na tag input e nada. Não possuo proxy e desativei todos os firewalls.

Engraçado que mesmo a aplicação adobe air, que roda fora do browser, apresentou o mesmo problema, porem ela faz esse envio usando o protocolo http. Então, passo a crer que seja alguma limitação no HTTP.
Dai o que fiz, leio o arquivo, quebro ele em pedaços menores e envio. Funcionou porem não possuo os recursos para fazer isso no flex, somente no adobe air porque ele roda fora do sandbox.

Que merda cara, isso vai inviabilizar muita coisa na minha aplicação.

Mais alguma dica?

Obrigado!

M

Segundo informações metade desse valor 2^32 são números negativos. Dai resulta em 2gbs.

No caso do php mesmo setando UPLOAD_MAX_FILESIZE e POST_MAX_SIZE não funcionou. Ainda sim, quando rodo no php <% echo ini_get(“upload_max_filesize”); %> exibiu um valor bem acima do que eu estou enviando. Agora, como eu poderia configurar isso no meu jboss ou no tomcat para poder usar meu servidor java?

Configurei tambem o MaxLenght na tag input e nada. Não possuo proxy e desativei todos os firewalls.

Engraçado que mesmo a aplicação adobe air, que roda fora do browser, apresentou o mesmo problema, porem ela faz esse envio usando o protocolo http. Então, passo a crer que seja alguma limitação no HTTP.
Dai o que fiz, leio o arquivo, quebro ele em pedaços menores e envio. Funcionou porem não possuo os recursos para fazer isso no flex, somente no adobe air porque ele roda fora do sandbox.

Que merda cara, isso vai inviabilizar muita coisa na minha aplicação.

Mais alguma dica?

Obrigado!

Se não me engano, o limite do AMF e 256MB (2^28 ).
http://opensource.adobe.com/wiki/download/attachments/1114283/amf3_spec_05_05_08.pdf (Página 12).

Tente com um arquivo de 255 e outro com 257. Veja o mesmo erro ocorre.

[]'s

T

No caso do upload não uso AMF porque ele não da suporte a envio de arquivos em multiplas partes. No caso do AMF teria que ler todos os bytes e enviar de uma vez. Desse jeito não daria mesmo, estouro de memória na certa. Para você ver eu ja consigo enviar ate 2GB muito acima dos 258MB do AMF.

Dai estou fazendo uma requisição normal do mvc spring. Basicamente uma requisição post de um servlet normal. Dai eu uso FileUpload da apache para ler esses fragmentos que vão chegando pelo request.

T

Depois de muitos testes, lendo as requisições http cheguei a uma conclusão que é uma limitação de browser. Infelizmente não tem como enviar mais que 2GB usando a maneira convencional em sistemas operacionais 32bits. Alguns browsers que rodam em plataforma 64bits conseguem enviar até no máximo 4GB. De uma olhada no link http://www.motobit.com/help/ScptUtl/pa98.htm , os resultados obtidos nesse link foram bem parecidos com os meus. Testei em algumas maquinas virtuais com plataformas , sistemas operacionais e linguagens diferentes, todos apresentam o mesmo problema.

No meu caso farei igual ao youtube. Se o usuario quiser enviar mais que 2GB ele precisa baixar o aplicativo AIR para a maquina local. Assim, consigo usar opções mais avançadas fora do sandbox para quebrar o arquivo, envia-lo em varias requisições menores. Dai, no servidor eu monto o arquivo original. Nos testes iniciais ficou perfeito.

É isso ai galera, se alguem tiver algo a acrescentar seria de grande valia.

Até.

D

Reabrindo a discussão. Estou precisado desenvolver um uploader que envie arquivos de qualquer tamanho, até então tenho usado Applet Java para fazer isso, porém, é uma constante dor de cabeça devido à obrigatoriedade de instalação do plugin no cliente.

Agora notei uma coisa interessante, o novo componente de upload do Youtube envia arquivos de qualquer tamanho sem a necessidade de nenhum plugin. Fiz o teste na vera aqui, desabilitei todos os plugins (flash, silverlight e java) e tentei fazer um upload de um arquivo maior que 5 GB. E não é que funcionou? Como eles conseguiram fazer isso? Já que existe esse limite no próprio browser. Alguem tem ideia?

E

está usando um navegador x64? Com navegador x64 eu consigo enviar normalmente mais que 4GB.

D

Não. 32bits. Estou usando o Chrome, mas para garantir testei no IE e por incrível que pareça funcionou também.

Criado 21 de junho de 2011
Ultima resposta 31 de jan. de 2012
Respostas 10
Participantes 4