Leobreda.Net

HTML | DHTML | JavaScript | DOM | Ajax | Asp | Asp.net | PHP | Ms. SQL | MySQL

TAG cloud

.net     ajax     api     arquivo     array     asp     asp.net     banco de dados     bing     bloqueio     boas práticas     bug     c sharp     c#     c#     chart     classe     collate     collation     complemento     complementos     componente     conexão sql     connection string     css     cursor location     desativar programas     dom     erro cs0246     explorer     ferramenta de busca     firefox     ftp     função     global.asa     global.asax     google     gráfico     helicon     hospedagem ruim     hostphd     http 301     imagem     include     indexação     inicialização     insert     internet lenta     legendas     limit

Pesquisa por: arquivo

Manipulando arquivos em PHP

arquivo, classe, mkdir, php, rmdir, unlink, upload

04 de agosto de 2009     06:50201 visitas

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
    }
     
   }
  } 

2010 - Leonardo Breda