Ir para conteúdo
Fórum Script Brasil
  • 0

Upload de arquivo com mais de 1MB


svjets

Pergunta

Olá pessoal, meu problema é o seguinte, tenho um formulário para fazer upload de um arquivo para um banco de dados MYSQL usando PHP. Meu sistema funciona normalmente para arquivos de até 1MB, acima disto ele não armazena o arquivo no BD. Abaixo vou colocar as partes de interesse do código para vocês analisarem e quem sabe me dar uma dica do que pode estar acontecendo. Antes de mais nada, testei inicialmente este código em um servidor pago e tive o problema. Para verificar se não era alguma restrição do servidor, testei também o código no servidor instalado no meu PC. Localmente utilizo o XAMPP 1.5.5 (que tem PHP5 e Apache). No php.ini os valores de post_max_file e upload_max_filesize igual a 16MB. Abaixo o código:

FORMULÁRIO DE UPLOAD:

<form name="formulario" action="" method="post" enctype="multipart/form-data">
  <input type="hidden" name="MAX_FILE_SIZE" value="10240000" />
  <div id="pergunta07">
    <h2  id="p7" class="pergunta">Se desejar anexar algum arquivo, favor clicar aqui.</h2>
    <label class="anexar"><input type="file" name="arquivo" size="30" /></label>
  </div>
  <div id="botoes">
    <input name="" type="submit" value="Enviar" class="botao_ok" />
    <input name="" type="reset" value="Limpar" class="botao_limpa" />
  </div>
</form>
CÓDIGO PHP PARA GRAVAR O ARQUIVO NO BD:
/*-- Verifica o tamanho do arquivo de upload --*/
if(!$_FILES['arquivo']['size'] )
{
  echo "O tamanho de arquivo que deseja enviar é muito grande";
  exit;
}
if($_FILES['arquivo']['size'] > 10240000)
{
  echo "O tamanho de arquivo que deseja enviar é muito grande";
  exit;
}

/*-- Salva o arquivo no BD --*/
if(!empty($_FILES['arquivo']['name']))
{
  $nom1=strtolower($_FILES['arquivo']['name']);
  $caracteres=array("ç","~","^","]","[","{","}",";",":","´",",",">","<","-","/","|","@","$",
                      "%","ã","â","á","à","é","è","ó","ò","+","=","*","&","(",")","!","#","?","`","ã"," ","©");
  $nom=str_replace($caracteres,"",$nom1);
  $tp=$_FILES['arquivo']['type'];
  $fp=fopen($_FILES['arquivo']['tmp_name'], 'r');
  $arq=fread($fp,$_FILES['arquivo']['size']);
  $arq=addslashes($arq);
  fclose($fp);
  $sql=mysql_query("INSERT INTO arquivos (arq_ident,arq_nome,arq_tipo,arq_data) VALUES('$cod2','$nom','$tp','$arq')");
}

Eu testei imprimir o valor do erro do upload ($_FILES['arquivo']['error']) e retornou o valor "0", ou seja, o upload está sendo executado corretamente, inclusive verifiquei isso monitorando o diretório temporário para onde o arquivo é salvo, e nele é gerado um arquivo temporário do tamanho do arquivo definido para o upload. Isso dá a entender que o problema é no MYSQL que, por algum motivo, não copia arquivo maior que 1MB. O campo "arq_data" é um MEDIUMBLOB, ou seja, deveria aceitar qualquer arquivo dentro do limite que estabeleci de 10MB no código. Alguém teria alguma ideia de qual é o problema? Seria alguma configuração do MYSQL mesmo?

Fico no aguardo.

Editado por svjets
Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Amigos, depois de uns 4 dias quebrando a cabeça, após escrever o post acima acabei colocando a cabeça para funcionar e descobri o problema em menos de 5 minutos. No meu servidor local, abri o arquivo "my.cnf" que é o de configuração do MYSQL e verifiquei que o valor do "max_allowed_packet" estava setado a 1M. Alterei este valor para 16M e tudo começou a funcionar corretamente. Bom, creio que meu post sirva ao menos para ajudar pessoas que nem eu que não tem tanta experiência. Já vou aproveitar para deixar um comentário sobre o input oculto "MAX_FILE_SIZE" pois nos fóruns da vida muita gente diverge sobre ele e eu considero algo fundamental para um código não parecer muito amador.

MAX_FILE_SIZE:

<input type="hidden" name="MAX_FILE_SIZE" value="10240000" />

Este input oculto no HTML é interpretado pelas versões mais atuais dos principais browsers (não sei listar versões e nem os browsers). Ele tem a função de evitar que o usuário tente fazer upload de um arquivo maior que o permitido pelo seu sistema. Ele é facilmente burlável pelo lado do usuário, então não é recomendado para ser utilizado como única forma de restrição de tamanho do upload de arquivo. Porém, considero importante a utilização deste input no código pois ele será útil para usuários idôneos que por ventura tentem enviar arquivos maiores que o configurado. Como este campo é interpretado pelo browser, ele faz a verificação do tamanho do arquivo a ser enviado antes do upload, no lado do usuário, poupando o usuário de esperar que o arquivo seja enviado ao servidor para daí ser testado.

Espero que este tópico possa ajudar alguém.

Abraços.

Editado por svjets
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...