HTML, JavaScript, PHP, ASP, .Net, C#, MySQL, Ms. SQL ...

Manipulando arquivos em PHP

Utilize componentes nativos do PHP para efetuar upload, criar e excluir arquivos e diretórios

arquivo classe mkdir php rmdir unlink upload

Dias atrás tive um certo problema com o ASP: efetuar upload nele é a pior coisa que existe, ainda mais em arquivos com mais de 2MB.

Hoje em dia, não basta upload de imagens e documentos do Word e PDF, pois sabemos que a maioria dos sites já estão trabalhando com conteúdos multimídia, tais como áudio e vídeo.

Existe uma solução paga que resolve o problema, as empresas de hospedagem possuem tal componente instalado, porém você não vai pagar para ter uma DLL instalada em sua estação de desenvolvimento por uma simples função de upload.

A minha solução foi esta aqui: separar as páginas que efetuam o UPLOAD em linguagem PHP.

 

Para efetuar o upload:

<form method="post" action="upload.php" enctype="multipart/form-data">
  <input type="file" name="arquivo"  />
  <input type="submit" value="upload" />
</form>

Arquivo upload.php

<?php

  include_once("cla_arquivo.php");

  $objArquivo = new Arquivo;


    $objArquivo->diretorio  = c:\site\arquivos\";
    $objArquivo->arquivo   = $_FILES["arquivo"];
    $objArquivo->tamanho    = 4096000;   //tamanho máximo: 4mb
    $objArquivo->arquivo    = $arquivo;
  
    $objArquivo->EfetuaUpload();


    $titulo  = $objArquivo->titulo;    //retorna o nome do arquivo tratado dentro do método
    $erro    = $objArquivo->erro;      //retorna mensagem de erro (se houver)
    $tamanho = $objArquivo->tamanho;   //retorna o tamanho do arquivo (em bytes)

 

   unset($objArquivo); //destrói o objeto

Classe Arquivo - cla_arquivo.php

 Class Arquivo
 {
  var $diretorio;
  var $titulo;
  var $tamanho;
  var $arquivo;
  var $erro;
  
###########################################################################################################
# Efetua o upload do arquivo
#
#  Entra: diretorio : Diretório de destino
#         tamanho   : Tamanho máximo do arquivo (em bytes)
#         arquivo   : Arquivo binário + caminho do arquivo (lado cliente)
#
#  Retorna:  arquivo : O nome do arquivo tratado
#            tamanho : Tamanho do arquivo (em bytes)
#            erro    : Mensagem de erro
########################################################################################################### 
  function EfetuaUpload()
  {
   $diretorio   = strtolower(trim($this->diretorio)); //Diretório de destino

   $tamanho   = $this->tamanho;     //Tamanho máximo do arquivo (em bytes)
   $arquivo  = $this->arquivo;      //Arquivo binário 
   
   $this->erro    = '';               //Nenhum erro até agora
   $this->$titulo = $arquivo['name']; //Nome do arquivo


    //Verifica se ultrapassou o tamanho máximo de arquivo  Tolerância: 10%
    if(intval($arquivo['size'])>intval($tamanho*1.1))
    {
     $this->erro = 'O tamanho do arquivo ultrapassou ' . $tamanho . ' Bytes';
     unset($diretorio, $tamanho, $titulo, $arquivo);
     return;
    }
   
    //Trata o nome do arquivo, com limite de 30 caracteres

    $objArquivo = new Arquivo;

    $titulo = $objArquivo->TratarNomeArquivo(strtolower($titulo), 30);
    
    //Cria diretório de destino (se necessário)
    $objArquivo->CriarDiretorio($diretorio);
    

    unset($objArquivo);
   
   
    //Insere a barra "\" no final do diretório, se não houver a mesma
    if(substr($diretorio, strlen($diretorio)-1, 1)!="\")
    {
     $diretorio+="";
    }  
    
    //Efetua o Upload. ATENÇÃO: Verifique se o diretório temporário aceita mover arquivos. Consulte php.ini...

    if(!move_uploaded_file($arquivo['tmp_name'], $diretorio.$titulo))
    {
     $this->erro = 'Não foi possível efetuar o upload. Favor contate o Administrador. Código de erro:'.$arquivo['error'].' Descrição do erro:'.print_r($arquivo).': '.mysql_error();
     echo($arquivo);
     unset($diretorio, $titulo, $tamanho, $arquivo);
     return;
    }
    
   
  

    //Devolve o novo nome do arquivo, tamanho, e mensagem de erro em branco
    $this->titulo = $titulo;
    $this->tamanho = intval($arquivo['size']);
    $this->erro = '';
    
    unset($diretorio, $titulo, $tamanho, $arquivo); 
  } 
  

  
  ###########################################################################################################
  # Trata o nome do arquivo, retirando determinados caracteres
  # Saída: Nome do arquivo sem pontuação, espaço e acentuação.
  ########################################################################################################### 
  function TratarNomeArquivo($arquivo, $tamanho=0)
  {
   //1. Separa a extensão do arquivo
   $extensao = substr($arquivo, strrpos($arquivo, "."));
   //2. Separa apenas o nome do arquivo, sem extensão
   $arquivo = str_replace($extensao, "", $arquivo);
   //3. Retira acentuação
   $arquivo = str_replace("á", "a", $arquivo); $arquivo = str_replace("à", "a", $arquivo); $arquivo = str_replace("ã", "a", $arquivo); $arquivo = str_replace("â", "a", $arquivo);
   $arquivo = str_replace("é", "e", $arquivo); $arquivo = str_replace("è", "e", $arquivo); $arquivo = str_replace("ê", "e", $arquivo);
   $arquivo = str_replace("í", "i", $arquivo); $arquivo = str_replace("ì", "i", $arquivo);
   $arquivo = str_replace("ó", "o", $arquivo); $arquivo = str_replace("ô", "o", $arquivo); $arquivo = str_replace("ô", "o", $arquivo);
   $arquivo = str_replace("ú", "u", $arquivo); $arquivo = str_replace("ù", "u", $arquivo); $arquivo = str_replace("ü", "u", $arquivo);
   
   $arquivo = str_replace("!", "", $arquivo); $arquivo = str_replace("@", "", $arquivo); $arquivo = str_replace("+", "-", $arquivo);
   $arquivo = str_replace(" ", "_", $arquivo); $arquivo = str_replace("___", "_", $arquivo); $arquivo = str_replace("__", "_", $arquivo);
   
   //4. Limita a quantidade de caracteres
   if($tamanho!=0)
   {$arquivo = substr($arquivo,0, $tamanho-1);}
   
   return $arquivo.$extensao;
  } 
  
  
  
  ###########################################################################################################
  # Cria diretório
  ########################################################################################################### 
  function CriarDiretorio($diretorio)
  {
   $diretorio = str_replace("/", "", $diretorio);
   $diretorioX = explode("", $diretorio);
   $diretorioY = $diretorioX[0];
   for($i=1;$i<count($diretorioX);$i++)
   {
    $diretorioY.="". $diretorioX[$i];
    if($i>2) //Evita considerar que "C:" seja diretório, como também diretórios virtuais
    {
     if(!is_dir($diretorioY)){mkdir($diretorioY, 0777);}
    }
   
   }
  }  
  
    
  
 }

Você pode incrementar a classe Arquivo com métodos para excluir arquivos e diretórios:

###########################################################################################################
  # Exclui arquivo
  ########################################################################################################### 
  function ExcluirArquivo()
  {
   $diretorio   = strtolower($this->diretorio); //Diretório onde consta o arquivo
   $arquivo   = $this->arquivo;    //Arquivo a ser deletado
   
    if(file_exists($diretorio.$arquivo))
    {
     unlink($diretorio.$arquivo);
    }
  } 
  
  ###########################################################################################################
  # Exclui diretório
  ########################################################################################################### 
  function ExcluirDiretorio()
  {
   $diretorio   = strtolower($this->diretorio); 
   
   if(is_dir($diretorio)) // verifica se realmente é uma pasta
      {

    if($handle = opendir($diretorio)) //Abre o diretório
    {
     while(false !== ($file = readdir($handle))) // Varre cada um dos arquivos da pasta
     {
      if(($file == ".") or ($file == ".."))
      {
       continue;
      }
      if(is_dir($file)) // verifica se o arquivo atual é uma pasta
      {
       // caso seja uma pasta, faz a chamada para a funcao novamente
       $objExcluir = new Arquivo;
       $objEcluir->diretorio = $diretorio . $file;
       $objExcluir->ExcluirDiretorio();
       unset($objExcluir);
      } else
      {
       // caso seja um arquivo, exclui ele
       unlink($diretorio.$file);
      }
     }
     // fecha a pasta aberta
           closedir($handle);
     rmdir($diretorio); //exclui o diretório
    }
     
   }
  } 

TAGs

ajax arquivo asp boas práticas classe conexão sql connection string cursor location desativar programas erro cs0246 função global.asa global.asax google gráfico include rewriterule upload url amigável url rewrite


2010 - Leonardo Breda