PHP – Exibindo arquivos de diretórios + filtro de arquivos

  • Autor do post:
  • Categoria do post:PHP DEV

PHP – Exibindo arquivos de diretórios + filtro de arquivos

Olá pessoal, vamos ver como exibir os arquivos de um diretório com PHP5 e vamos também utilizar um filtro para extensão dos arquivos, assim podemos mostrar apenas as extensões desejadas no diretório.

Neste exemplo iremos inserir com a tag IMG (HTML) as imagens disponíveis em um diretório.

Para realizarmos o feito iremos utilizar classes nativas do PHP5 e são elas:
– DirectoryIterator
– RegexIterator

Vamos criar nossa classe e chama-la de FileFilter.class.php  ou se preferir chame-a de Beatriz, como quiser.

<?php
class FileFilter
{
 private $diretorio;
 private $filtro;

 public function __construct($diretorio, $filtro)
 {
  $this->diretorio = $diretorio;
  $this->filtro = $filtro;
 }

 public function showFiles()
 {
  $dir = new DirectoryIterator($this->diretorio);
  $filtro = new RegexIterator($dir, $this->filtro);

  foreach ($filtro as $arquivo)
  {
   print "<img src="$this->diretorio/$arquivo">n";
  }
 }
}
?>

Criada nossa classe iremos criar o arquivo index.php, bem, você já conhece as regras, pode ser “jao.php”.

<?
# Incluindo a classe
require_once 'FileFilter.class.php';

# Instância do Obj, diretório e aplicação do filtro
$filter = new FileFilter("images", "/jpg/");

# Printa na tela os arquivos encontrados
$filter->showFiles();
?>


E termina aí, vamos ver algumas linhas da Classe:

__construct:
O método construtor recebe o diretório que possui, neste caso específico, as imagens ($diretorio).

DirectoryIterator($this->diretorio)
– Cria a Iteração no diretório passado por parâmetro no método construtor.

RegexIterator($diretorio, $this->filtro)
– Aplica a regra na Iteração, neste caso a regra é o filtro/extensão passada no construtor ($filtro).

print “<img src=$this->diretorio/$arquivo>” 
– Como pode perceber esta linha insere na saida cada arquivo encontrado na condição do filtro.

Linhas do arquivo index.php:

$filter = new FileFilter(“images”, “/jpg/”)
– Instância do Obj passando o diretório e extensão que deve ser listada.

$filter->showFiles()
Exibe os arquivos encontrados na condição do filtro, neste caso apenas arquivos JPG.

É isso aí pessoal!

Docs:
http://br2.php.net/DirectoryIterator
http://br2.php.net/manual/pt_BR/class.regexiterator.php

Ah!!!
Nunca se esqueçam de que no windows não é utilizado o “Sensitive Case”, ou seja, tanto faz se o nome do arquivo está em letras maísculas ou minúsculas,
no entanto no linux(glória Jesus) isso é de extrema importância, irei dar exemplos:

No Windows, se fizer:
–  require_once ‘filterfile.class.php’ ou FilterFile.class.php  as duas formas irão funcionar

No Linux (amém) para funcionar deve chamar exatamente como está nomeado o arquivo.
– require_once ‘FileFilter.class.php’ ;

Abraços e até logo,

Este post tem 21 comentários

  1. Cláudia

    Olá, apesar d não acrescentar na postagem, vou deixar um comentário… Acho esse blog muito legal, já está a tempos nos favoritos, apesar d não entender muita coisa pois estou iniciando a programação de uma galeria na faculdade… Mas enfim, lhe agradeço a disposição por estar dispondo d seu tempo para ajudar outros programadores. Valeu!

    1. Rafael Clares

      Cláudia, obrigado pelo comentário, são esses que me mantém escrevendo!
      Tenha um ótimo fim de semana!

  2. Andre Carvalho

    Olá Rafael !
    Faço das palavras da Cláudia as minhas, e apesar de já ter bastante tempo com TI, gosto muito das tuas postagens, são sempre interessantes e acrescentam bastante no trabalho do dia-a-dia !
    Parabéns pela criatividade.
    Abs !

    1. Rafael Clares

      André, obrigado pelo comentário, fico feliz que o conteúdo do blog lhe interesse.
      Um forte abraço

  3. Aidar

    Sempre consulto seu blog, aliais esta perfeito muito bom mais olha ia agora fiquei perdido :

    Fatal error: Uncaught exception ‘RuntimeException’ with message ‘DirectoryIterator::__construct(images) [directoryiterator.–construct]: failed to open dir: No such file or directory’ in C:VertrigoServwwwtesteexDiretoriosFileFilter.class.php:15 Stack trace: #0 C:VertrigoServwwwtesteexDiretoriosFileFilter.class.php(15): DirectoryIterator->__construct(‘images’) #1 C:VertrigoServwwwtesteexDiretoriosindex.php(18): FileFilter->showFiles() #2 {main} thrown in C:VertrigoServwwwtesteexDiretoriosFileFilter.class.php on line 15

    Onde eu coloco o diretório?

    1. Rafael Clares

      Se você seguiu direito o post, ou seja, criou os 2 arquivos e depois no informou no $filter = new FileFilter(“images”, “/jpg/”); o diretório não deveria dar nada errado,
      como ficou o php que faz a listagem ? no caso do post o 2 arquivo… e qual a versão do seu PHP ? Essa classe vai funcionar no PHP5. Se for o PHP5 o teu, me diz como ficou a linha

      Estou vendo que a classe está em:
      C:VertrigoServwwwtesteexDiretoriosFileFilter.class.php

      e o arquivo neste caso não está encontrando o diretório
      C:VertrigoServwwwtesteexDiretoriosimages
      Esse diretório existe?

  4. Aidar

    Nossa cara desculpa ai foi um erro mesmo faltou o diretório pensei que eu teria que dizer o caminho do diretório viajei.
    Valeu pela dica.

  5. Maicol

    Bem interessante esse filtro, mas você saberia me dizer que critérios ele usa para ordenação dos arquivos do diretorio escolhido?

    Abraços

    1. Rafael Clares

      Maicol, como o filtro está “pegando” o nome do arquivo, ele ordena a listagem pelo “nome”.
      Você pode testar outros métodos para que retorne outras informações do arquivo e a partir disso criar a listagem na ordem desejada, mas para isso precisará consultar a doc:
      http://br2.php.net/DirectoryIterator
      Infelizmente não tenho nenhum exemplo aqui que alterna a ordem.
      até,

  6. Luis Claudio

    Mais uma vez, parabéns pela praticidade do script.
    Está 100% funcionando aqui, e será muito útil.
    Uma dúvida que fiquei é se tem como o filtro “pegar” mais tipos de arquivos de uma vez, e como ficaria a sintaxe. Como separo as extensões na linha: $filter = new FileFilter(“images”, “/jpg/”); ?
    Fiz alguns testes mas não consegui.
    Obrigado.

    1. Rafael Clares

      Olá, desculpe a demora ao responder, estive ausente um pouco.
      Bem, basta mudar um pouco os métodos, seria assim:

      class FiltraArquivos {

      private $diretorio;
      private $filtro;

      public function __construct($diretorio) {
      $this->diretorio = $diretorio;
      }

      public function imprimeResultado($filtro) {
      $this->filtro = $filtro;
      $diretorio = new DirectoryIterator($this->diretorio);
      $filtro = new RegexIterator($diretorio, $this->filtro);
      foreach ($filtro as $arquivo) {
      print "$arquivon";
      }
      }
      }
      $filtra = new FiltraArquivos("images");
      $filtra->imprimeResultado("/jpg/");
      $filtra->imprimeResultado("/png/");

  7. Roger

    Cara eu tenho uma duvida eu tenho este codigo e nao consigo listar em ordem numerica
    <?php

    $url="caminho";
    $dir = "diretorio";
    if(is_dir($dir)){
    $handle=opendir($dir);
    while(false !== ($file = readdir($handle))){

    if($file=='.' || $file=='..' || $file == "Thumbs.db") continue;

    $html .= "

    “;
    }

    }

    echo $html;
    ?>

    1. Rafael Clares

      Véi aqui não dá pra postar código, fica ilegível. Coloca no pastebin.com e me manda o link.;
      abs

  8. Rodrigo Motta

    Bom dia Rafael, como faço para exibir em ordem alfabética?

      1. Rodrigo Motta

        Olhei os links mas nao diz nada sobre ordem ou order. acho que está função nao tem. mas obrigado mesmo assim.

          1. Rodrigo Motta

            engraçado, no meu server local funcionou, mas quando coloquei no server oficial nao. Obrigado pela ajuda. bom, estou saindo agora. volto amanhã para tentar mais.

          2. Rodrigo Motta

            Realmente ele não lista em ordem quando coloco no servidor.

  9. Gregoryous

    Rodrigo tenta ver as permissões de escrita no seu Servidor. talvez resolva!

    1. Rafael Clares

      Boa Greg, é isso mesmo! Valeu pela força. Seria muito bom se mais pessoas participassem e ajudassem uns aos outros. Infelizmente não tenho taaaaanto tempo;

Os comentários estão encerrados.