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,
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!
Cláudia, obrigado pelo comentário, são esses que me mantém escrevendo!
Tenha um ótimo fim de semana!
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 !
André, obrigado pelo comentário, fico feliz que o conteúdo do blog lhe interesse.
Um forte abraço
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?
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?
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.
Bem interessante esse filtro, mas você saberia me dizer que critérios ele usa para ordenação dos arquivos do diretorio escolhido?
Abraços
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é,
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.
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/");
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;
?>
Véi aqui não dá pra postar código, fica ilegível. Coloca no pastebin.com e me manda o link.;
abs
Bom dia Rafael, como faço para exibir em ordem alfabética?
Rodrigo, creio 99% que sim mas você precisará dar uma olhada nas docs
http://br2.php.net/DirectoryIterator
http://br2.php.net/manual/pt_BR/class.regexiterator.php
abs
Olhei os links mas nao diz nada sobre ordem ou order. acho que está função nao tem. mas obrigado mesmo assim.
Tenta isso
http://pastebin.com/8Ed9Se0p
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.
Realmente ele não lista em ordem quando coloco no servidor.
Rodrigo tenta ver as permissões de escrita no seu Servidor. talvez resolva!
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;