Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Diego Rinno

Meu sistema de upload não funciona com arquivos grandes.

Recommended Posts

Olá pessoal, sou novato aqui e também sou novato em programação PHP, mas criei um sistema pra upload múltiplo de arquivos pro meu site e até então ele estava funcionando perfeitamente, só que eu quis incrementar liberando níveis de conta de usuário. Dependendo do nível da sua conta você pode fazer upload de vídeos também, com limite pro tamanho de cada um dos vídeos enviados, inclusive, usando o MAX_FILE_SIZE.

 

Bom, o caso é que upload de arquivos com até 10Mb ele aceita numa boa, mas tento enviar arquivos de 20Mb pra cima e ele quando chega em 100% do upload redireciona pro meu index.php, sendo que esse index.php que ele redireciona nem é o que está dentro do diretório em que se encontram estes scripts de upload, ele redireciona pro meu domínio principal e não pro diretório com estes arquivos, compreende? É doideira pura mesmo.

 

Eu to sem saber o que fazer, já tentei até mesmo colocar o set_time_limit(0) pensando que talvez pelo arquivo enviado ser grande demais e o upload ser demorado pudesse estar dando erro no tempo de execução do script, mas não adiantou. Também setei o MAX_FILE_SIZE pra 80Mb (83886080 Bytes) e tentei enviar um arquivo de 20Mb, mas ainda acontece o mesmo de redirecionar pro meu domínio principal.

 

Outro ponto é que ele conecta no banco de dados e modifica lá na conta do cara que ta enviando os vídeos e calcula qual o tamanho do vídeo que enviou, formata com o number_format() e envia esse valor pro banco de dados, porque ele tem limite de espaço de armazenamento, então ele vai somando esses tamanhos dos uploads até alcançar o limite e então bloqueia o envio.

 

Bom, esse aqui é o meu formulário de enviar os vídeos:

 

formulario.php

<?
set_time_limit(0);
include "config.php";
$BE_LOGIN = $_COOKIE["login"];
$BE_PASSWORD = $_COOKIE["senha"];

$db   = mysql_connect ($host, $login_db, $senha_db);
$basedados      =       mysql_select_db($database);

$confirmacao = mysql_query("SELECT * FROM `$tabela` WHERE login = '$BE_LOGIN' AND senha = '$BE_PASSWORD'", $db);
while ($row = mysql_fetch_array($confirmacao)) {
        $conta_imagem = $row["conta_imagem"];
        $tamanho_imagem = $row["tamanho_imagem"];
        }
$contagem = mysql_num_rows($confirmacao);

if ( $conta_imagem == 1 AND $tamanho_imagem >= 5120 ) {
echo "Você já atingiu o limite de armazenamento, faça upgrade em sua conta para continuar enviando arquivos!"; exit;
} elseif ( $conta_imagem == 2 AND $tamanho_imagem >= 15360 ) {
echo "Você já atingiu o limite de armazenamento, faça upgrade em sua conta para continuar enviando arquivos!"; exit;
} elseif ( $conta_imagem == 3 AND $tamanho_imagem >= 30720 ) {
echo "Você já atingiu o limite de armazenamento, faça upgrade em sua conta para continuar enviando arquivos!"; exit;
} elseif ( $conta_imagem == 4 AND $tamanho_imagem >= 66560 ) {
echo "Você já atingiu o limite de armazenamento, apague alguma imagens ou vídeo para continuar enviando ou adquira o plano Infinity For Life!"; exit;
}
?>
<HTML>
<HEAD>
 <TITLE>Upload</TITLE>
</HEAD>
<BODY>
  <form action="envia_arquivos.php" method="post" enctype="multipart/form-data">
  <input type="hidden" name="MAX_FILE_SIZE" value="83886080">
  <input name="arquivo[]" type="file" size="3" id="arquivo[]" multiple="multiple" />
<BR>
  <input type="image" src="images/load.png" name="submit">
<BR><BR>
Aguarde o envio...
  </form>
</BODY>
</HTML>

E esse aqui é o script que faz o envio tanto de vídeos quanto de imagens:

 

enviar.php

<?php
set_time_limit(0);
include "config.php";
$BE_LOGIN = $_COOKIE["login"];
$BE_PASSWORD = $_COOKIE["senha"];

$db   = mysql_connect ($host, $login_db, $senha_db);
$basedados      =       mysql_select_db($database);

$confirmacao = mysql_query("SELECT * FROM `$tabela` WHERE login = '$BE_LOGIN' AND senha = '$BE_PASSWORD'", $db);
while ($row = mysql_fetch_array($confirmacao)) {
        $conta_imagem = $row["conta_imagem"];
        $tamanho_imagem = $row["tamanho_imagem"];
        $list_my_images = $row["list_my_images"];
        $USER = $row["login"];
        $PaStA = $row["pasta"];
        }
$contagem = mysql_num_rows($confirmacao);

if ( $tamanho_livre <= 0 ) {
$tamanho_livre = 0;
}

//define os tipos permitidos
$tipos[0]="image/bmp";
$tipos[1]="image/jpeg";
$tipos[2]="image/png";
$tipos[3]="video/mp4";

// CRIA A VARIÁVEL QUE IRÁ ARMAZENAR OS LINKS DAS IMAGENS ENVIADAS
$imagens_enviadas = "";
$videos_enviados = "";

// FAZ A COMPARAÇÃO SE A PASTA REALMENTE EXISTE
$diretorio = "Upload/$PaStA";

if (!is_dir($diretorio)){ echo "Pasta $diretorio não existe";}

// CASO A PASTA EXISTA IMPRIME A MENSAGEM ABAIXO E CONCLUI O UPLOAD
else {


                $arquivo = isset($_FILES['arquivo']) ? $_FILES['arquivo'] : FALSE;
                   
                    for ($k = 0; $k < count($arquivo['name']); $k++)
                        {
                          $nomeOriginal = $arquivo['name'][$k];
                          $nomeData = date("dmYHis").$nomeOriginal;
                          $nome_MD5 = substr(md5($nomeOriginal.date("dmYHis").rand(9282746,5847361523465768)),-3);
                          $nome_Extensao = strrchr($arquivo["name"][$k], '.');
                          $tipo = $arquivo['type'][$k];
                          $tamanho = $arquivo["size"][$k];
                          $TAM = $tamanho / 1024;
                          $convert_MB = $TAM / 1024;
                          $valor_mb = number_format($convert_MB,2);
                          
// MODIFICA NO MySQL ADICIONANDO O TAMANHO OCUPADO PELA IMAGEM ENVIADA
$db   = mysql_connect ($host, $login_db, $senha_db); //conectamos ao mysql
$basedados      =       mysql_select_db($database); //conectamos ao database

$confirmacao = mysql_query("SELECT * FROM `$tabela` WHERE login = '$BE_LOGIN' AND senha = '$BE_PASSWORD'", $db); //verificamos se o conteudo dos cookies esta correto
while ($row = mysql_fetch_array($confirmacao)) {
        $tamanho_imagem = $row["tamanho_imagem"];
        }
$contagem = mysql_num_rows($confirmacao); //resultado da pesquisa acima

$tamanho_imagem = $tamanho_imagem + $valor_mb;

$mudar = mysql_query("UPDATE tbl_membros SET tamanho_imagem = '$tamanho_imagem' WHERE login = '$BE_LOGIN' AND senha = '$BE_PASSWORD'");


                          $nome_final = date('d_m_Y-H_i_s').$nome_MD5.$nome_Extensao;
                          
                          // SE FOR VÍDEO VERIFICA SE A PASTA VÍDEOS EXISTE
                          if ( $tipo == $tipos[3] AND $conta_imagem >= 2 ) {
                          $arquivo_tipo = "video";
                          $diretorio = "Upload/$PaStA/videos";
                              // SE A PASTA NÃO EXISTE ENTÃO CRIA ELA
                              if (!is_dir($diretorio)){ mkdir("$diretorio");}
                              // E SETA O DESTINO NESTA PASTA CRIADA
                          $destino = $diretorio."/".date('d_m_Y-H_i_s').$nome_MD5.$nome_Extensao;
                          } //SE TIVER ENVIADO UM VÍDEO COM CONTA SEM ESTA PERMISSÃO TERMINA O SCRIPT E MANDA AVISO
                          elseif ( $tipo == $tipos[3] AND $conta_imagem == 1 ) {
                          echo "Sua conta não tem permissão para enviar este tipo de arquivo. Para enviar vídeos faça um upgrade em sua conta."; exit;
                          } // CASO NÃO SEJA VÍDEO SETA O DIRETÓRIO COMUM
                          else { $destino = $diretorio."/".date('d_m_Y-H_i_s').$nome_MD5.$nome_Extensao; }
                          
                          //PERMITE ARQUIVOS .GIF SE A CONTA POSSIBILITAR
                          if ( $conta_imagem >= 2 ) {
                          $tipos[4]="image/gif";
                          }

                          // ACRESCENTA OS LINKS DAS IMAGENS ENVIADAS PARA EXIBIÇÃO POSTERIOR
 $USUARIO = $USER;
 $caminho = "Upload/$PaStA/$nome_final";
 if ( $arquivo_tipo != "video" ) {
$imagens_enviadas .= "
<BR>
URL para compartilhar a imagem:<BR><input id='url_share' name='url_share' type='text' value='http://pclife.carlossimas.com/MySocialShare/view_photo.php?camarq=" . $caminho . "&user=" . $USUARIO . "' size='140'>
<BR>
Link direto para a imagem:<BR><input id='url_direto' name='url_direto' type='text' value='http://pclife.carlossimas.com/MySocialShare/" . $caminho . "' size='140'>
<BR><BR>
<a href='javascript:redirecionar()'><font size='5'>Ver a Imagem</font></a>
<BR><BR>";
} else {
 $caminho = "Upload/$PaStA/videos/$nome_final";
$videos_enviados .= "
<BR>
URL para compartilhar o video:<BR><input id='url_share' name='url_share' type='text' value='http://pclife.carlossimas.com/MySocialShare/view_photo.php?video=" . $caminho . "&user=" . $USUARIO . "' size='140'>
<BR>
Link direto para o video:<BR><input id='url_direto' name='url_direto' type='text' value='http://pclife.carlossimas.com/MySocialShare/" . $caminho . "' size='140'>
<BR><BR>
<a href='javascript:redirecionar()'><font size='5'>Ver o Video</font></a>
<BR><BR>";
}
                          
                          if ( $tipo == $tipos[0] OR $tipo == $tipos[1] OR $tipo == $tipos[2] OR $tipo == $tipos[3] OR $tipo == $tipos[4] )
                           {
                            if (move_uploaded_file($arquivo['tmp_name'][$k], $destino))
                            {

                            } else {

                            }
                           } else { echo "Tipo de arquivo não permitido ou nenhum arquivo foi enviado. Veja o Guia de Utilização para saber quais arquivos são permitidos e como converter os seus para tais formatos."; exit;}

                        }



} // fecha else

?>
<center>
Enviado com sucesso!<BR><BR>
<?php
 if ( $arquivo_tipo == "video" ) {
 $href = "http://pclife.carlossimas.com/MySocialShare/view_photo.php?video=" . $caminho . "&user=" . $USUARIO;
 } else {
 $href = "http://pclife.carlossimas.com/MySocialShare/view_photo.php?camarq=" . $caminho . "&user=" . $USUARIO;
 }
 ?>
<HTML>
<HEAD>
 <TITLE>New Document</TITLE>
 <script language="JavaScript">
 function redirecionar(){
 	var redir =  confirm("Clique em OK para ver a imagem enviada. Esta janela sera fechada.")
 	if(redir == true){
     window.opener.location.href='<?php echo "$href";?>'
     window.close();
 	} else{

 	}
 }
 function selecionaTexto() {
   document.getElementById("url_share").select();
 }
 function selecionaTexto2() {
   document.getElementById("url_direto").select();
 }
 </script>
<SCRIPT LANGUAGE="JavaScript">
var copytoclip=1
function HighlightAll(theField) {
var tempval=eval("document."+theField)
tempval.focus()
tempval.select()
 if (document.all&©toclip==1){
  therange=tempval.createTextRange()
  therange.execCommand("Copy")
  window.status="Conteúdo selecionado e copiado para a área de transferência!"
  setTimeout("window.status=''",2400);
  }
}

function highlight(field) {
       field.focus();
       field.select();
}

function goToURL() { window.location = "javascript:HighlightAll('forms[0].select')"; }
</script>
</HEAD>
<BODY>
<?php
$confirmacao = mysql_query("SELECT * FROM `$tabela` WHERE login = '$BE_LOGIN' AND senha = '$BE_PASSWORD'", $db); //verificamos se o conteudo dos cookies esta correto
while ($row = mysql_fetch_array($confirmacao)) {
        $tamanho_imagem = $row["tamanho_imagem"];
        $conta_imagem = $row["conta_imagem"];
        }
$contagem = mysql_num_rows($confirmacao); //resultado da pesquisa acima

if ( $conta_imagem == 1 ) {
$tamanho_livre = 5120 - $tamanho_imagem;
$total_tamanho = 5120;
} elseif ( $conta_imagem == 2 ) {
$tamanho_livre = 15360 - $tamanho_imagem;
$total_tamanho = 15360;
} elseif ( $conta_imagem == 3 ) {
$tamanho_livre = 30720 - $tamanho_imagem;
$total_tamanho = 30720;
} elseif ( $conta_imagem == 4 ) {
$tamanho_livre = 66560 - $tamanho_imagem;
$total_tamanho = 66560;
}
?>
Você ainda tem <?php echo "$tamanho_livre";?>Mb de <?php echo "$total_tamanho";?>Mb livres para upload!
<BR><BR>
<center>Suas imagens ou vídeos enviados serão listados a seguir:
<BR>
<?php
if ( $arquivo_tipo != "video" ) {
echo $imagens_enviadas;
} else {
echo $videos_enviados;
}
?>
</BODY>
</HTML>

Desde já agradeço a ajuda aê galera!

Ah, lembrando que arquivos de até 10Mb eu envio numa boa. Maior que isso dá aquele erro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Diego,

 

Use a função phpinfo() e veja o tamanho do upload_max_filesize depois tente setar o ini_set

 

ini_set('upload_max_filesize', '100M');

Uma outra dica é para fazer upload use a classe do Verot que é muito boa e completa.

 

http://www.verot.net/php_class_upload.htm

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa, brigadão Alexandre.

O upload_max_filesize eu já tinha até setado pra 150Mb antes no php.ini, mas o erro continua mesmo assim.

 

Mas eu vou dar uma olhada nessa classe aí que você mandou, dar uma estudada nela e tentar mesclar com meu banco de dados pra definir as permissões e tal.

 

Brigadão aê pela dica, acho que rapidinho já consigo entender o funcionamento disso tudo e coloco pra funcionar :joia:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa, retornei aqui porque eu tinha marcado o tópico como resolvido, mas eu fui testar a classe do Verot pra fazer uploads, dei uma estudada boa nela e já até consegui mesclar com meu DB pra setar as permissões e tal. Mas o que acontece é que mesmo com a classe de upload dele, em sua forma original e sem qualquer modificação, o que acontece é que quando envio arquivos mais longos (cerca de 25Mb pra cima) o servidor encontra o 500 Internal Server Error. Eu fiz o upload usando realmente a classe dele limpinha, sem qualquer modificação, lá pela página que vem junto, pra você fazer os devidos testes com as ferramentas de upload que ele disponibiliza na classe.

 

A mensagem que aparece é:

 

 

 

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator, webmaster@carlossimas.com and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.

Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.

 

O que acontece é que eu já setei 150Mb no upload_max_filesize e também no post_max_size e to enviando um vídeo com exatamente 20,4Mb de tamanho, mas ta dando esse erro aí, quando o upload termina. Ele faz o upload todo, na hora de ir pra página upload.php dá esse erro, mas quando envio arquivos menores, de 10Mb ou menos ele vai tranquilo. O memory_limit também é por padrão 1024 na minha hospedagem. Sinceramente to mais perdido que cego em tiroteio, sem saber o que fazer, porque eu precisava mesmo que isso funcionasse direitinho :upset:

 

A classe dele funciona perfeitamente pra todos os arquivos, já fiz todos os testes que consegui imaginar. Mudei o tamanho do resize lá pras imagens, já enviei textos, pdf's e tudo o mais, só nas coisas com mais de 20, 25Mb que ta dando esse erro mesmo. Pode ser o max_input_time? Aqui ele ta setado pra 1800, acho que não é isso, né? rs
Eu sou bem novato nessa área mesmo, comecei a programar em PHP e JavaScript tem uns 3 meses só hahaha

Bom, é isso por enquanto. Brigadão aê quem puder ajudar, galera!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia,

 

Tenta pelo mod_rewrite do apache criando um .htaccess.

 

PHP 4

RewriteEngine On


# PHP 4, Apache 2.


<IfModule sapi_apache2.c>


  php_value magic_quotes_gpc                0


  php_value register_globals                0


  php_value session.auto_start              0


  php_value mbstring.http_input             pass


  php_value mbstring.http_output            pass


  php_value mbstring.encoding_translation   0


  php_value post_max_size 100M


  php_value upload_max_filesize 200M


  php_value memory_limit 96M


</IfModule>

PHP 5

RewriteEngine On


# PHP 5, Apache 1 and 2.


<IfModule mod_php5.c>


  php_value magic_quotes_gpc                0


  php_value register_globals                0


  php_value session.auto_start              0


  php_value mbstring.http_input             pass


  php_value mbstring.http_output            pass


  php_value mbstring.encoding_translation   0


  php_value post_max_size 100M


  php_value upload_max_filesize 100M


  php_value memory_limit 96M


</IfModule>

Espero que ajude.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Rapaz, to achando que eu fiz alguma coisa bem pequena mas muito errada, porque não é possível O.o
Nada ta funcionando. O que acontece é que quando coloquei o .htaccess aí de cima parou de dar o 500 Internal Server Error, mas aí voltou àquela coisa de em vez de seguir pra parte que devia ele abre o meu index.php do domínio principal.

 

aqui, essa é a tela que abre quando faço upload de arquivos de até uns 10Mb.

 

17_02_2013-09_38_5608d.png

 

 

 

Só que quando mando uns vídeos de 20Mb ou mais ele acaba indo pra essa tela aqui quando o upload chega em 100%.

 

 

 

17_02_2013-11_30_14d25.png

 

 

Essa tela é o domínio principal, ali dentro da popup.

 

Sinceramente não faço nem ideia de qual problema ta tendo O.o

 

Quem quiser testar o upload, eu coloquei uma versão sem precisar fazer login pra usar, pra vocês poderem testar se quiserem e/ou precisarem, é só acessar esse link: http://pclife.carlossimas.com/MySocialShare/envia_video2.php

 

Se forem testar, tentem enviar um arquivo pequeno e outro grande pra ver a diferença.

 

Achei que o problema fosse tipo no me antigo script de upload ou então no php.ini ou no .htaccess, mas mudei tudo isso e ainda continua dando esse erro doido aí. Mas pelo menos o 500 internal Server Error foi resolvido com a dica do angelorubin :yes: brigadão.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.