Quero permitir uploads de arquivos muito grandes em nosso aplicativo PHP (cem de megas – 8 shows). Há, no entanto, alguns problemas com isso.
Navegador:
Servidor:
Requisitos:
Como sobre um applet Java? Foi assim que tivemos que fazê-lo em uma empresa pela qual trabalhei anteriormente. Eu sei que os applets sugam, especialmente neste dia e idade com todas as nossas opções disponíveis, mas eles realmente são a solução mais versátil para problemas de desktop encontrados no desenvolvimento web. Apenas algo a considerar.
upload_max_filesize pode ser definido por diretório por diretório ; o mesmo vale para post_max_size
por exemplo:
php_value upload_max_filesize 10G php_value post_max_size 10G
Python Handler?
Usando um manipulador Python POST em vez de PHP. Gere um identificador exclusivo do seu aplicativo PHP para que o cliente possa colocar os headers HTTP. Com o mod_python para rejeitar ou aceitar o upload grande antes que todo o corpo POST seja transmitido.
Eu acho que http://www.modpython.org/live/current/doc-html/dir-handlers-hph.html
Permite verificar headers e recusar o resto da input POST. Não tentei, mas pode ser o caminho certo?
Olhando para a fonte do mod_python, o buffer da input via read () parece permitir uma avaliação do bit-at-a-time da input HTTP. Os headers são os primeiros.
https://svn.apache.org/repos/asf/quetzalcoatl/mod_python/trunk/src/filterobject.c
É velho, eu sei, mas talvez alguém também tenha esse problema agora. Agora você pode fazer isso com apenas Javascript e, digamos, PHP. Não é necessário Flash ou Java no lado do cliente.
demo: http://dnduploader.filkor.org/
A idéia é cortar os arquivos com o método Bloque Slim () do Javascript …
Você pode definir o post_max_size apenas para scripts em 1 diretório. Coloque seu script de upload lá e permita apenas esse script para lidar com tamanhos grandes. Ainda é possível que esse script seja atacado com arquivos grandes / inúteis, mas evita configurá-lo globalmente.
Use isso com a APC e você poderá descobrir algo de bom: artigo do IBM Developer works sobre APC
Tentei tudo isso … este é de longe o melhor que já usei …
Dê uma olhada no jumploader.com
Um bom java-applet para fazer o upload.
Eu usei isso para carregar imagens e funciona bem. Não tentei com arquivos maiores do que 10MB, mas eu também deveria trabalhar para arquivos realmente grandes.
Você analisou o uso da APC para verificar o progresso e o tamanho total do arquivo. Aqui está uma boa postagem no blog sobre isso. Isso pode ajudar.
Talvez você possa usar Webdav e Javascript no navegador
AJAX Big upload de arquivos, com progresso, para WebDAV
http://www.webdavsystem.com/ajax/programming/upload_progress
Uma biblioteca simples
http://debris.demon.nl/projects/davclient.js/doc/README.html
Você pode então obter o JS para redirect o usuário para uma página de sucesso. As chaves secretas e o que não podem ser manipulados em um prelúdio de PHP antes de entregar o JS Client-> WebDAV
Eu procuraria FTP, SSH ou SCP, isso permite que você carregue um arquivo grande e ainda tenha controle de access sobre o arquivo também. Isso pode levar um pouco mais para implementar, mas é provavelmente a maneira mais segura de que eu poderia pensar.
Tive sucesso com o upload , e eu recomendaria. É um script jQuery / Flash que lida com grandes carregamentos e você pode passar parâmetros extras para ele (como a chave secreta). Para resolver os problemas do lado do servidor, basta usar o seguinte código. As mudanças ocorrem apenas para o script em que são chamadas:
//Check to see if the key is there if(!isset($_POST['secret_key']) || !isValid($_POST['secret_key'])) { exit("Invalid request"); } function isValid($key) { //Put your validation code here. } //This line changes the timeout. //Give it a value in seconds (3600 = 1 hour) set_time_limit(3600); //Set these amounts to whatever you need. ini_set("post_max_size","8192M"); ini_set("upload_max_filesize","8192M"); //Generally speaking, the memory_limit should be higher //than your post size. So make sure that's right too. ini_set("memory_limit","8200M");
EDITAR Em resposta ao seu comentário:
Dado o que você disse, receio que você não consiga atender aos seus requisitos em http. Todas as soluções lá fora são o código que adiciona resources ao http para o qual nunca foi projetado.
Como você disse, é um protocolo simples. Além de escrever seu próprio software cliente que é executado fora do navegador, um applet java ou usando um protocolo diferente (como o FTP, que foi projetado para isso), você pode não conseguir o que deseja.
Eu fiz o melhor que pude dentro das restrições dadas. Desculpe, eu não poderia fazer melhor.
Eu sei que é uma sugestão para adicionar outra dependência, mas na minha experiência, a maioria dos sites que estão fazendo algo como isso está usando flash no lado do cliente e carregando o arquivo grande como pedaços
adobe como um howto em arquivos flash uploads
Eu também encontrei este tutorial sobre codeproject:
Upload de arquivos múltiplos com barra de progresso usando Flash e ASP.NET
PS – Eu sei que você está usando o PHP e não .net, pensei que a parte importante era o flash;)
Tente isso: http://www.simple2ftp.com usa um applet de FTP baseado em Java dentro de um wrapper inteligente de aplicativos PHP.