Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

GiSP

Listar arquivos como links, abrir em nova janela

Recommended Posts

Boa noite pessoal, estou com uma dúvida e gostaria da ajuda dos mais experientes se possível.

Eu tenho um diretório com vários arquivos, mas quero listá-los, mas mostrando apenas os que possuem a extensão ".txt" por exemplo.

Até aí pesquisei bastante e encontrei um código que consegue fazer isto sem problemas.

Abaixo o script lista os arquivos, esconde os que possuem outras extensões e exibe apenas os que tem extensão ".txt" como eu queria e exibe eles como links:

 

<?

// Define um array para armazenar os arquivos

$files = array();

 

// Diretório atual

$d = dir('.');

 

// Percorre todos os arquivos

while(false !== ($file = $d->read())){

// Se o arquivo não é este arquivo, e não começa com "." ou "~"

// e não termina em LCK, então guarde-o para exibição futura.

if(($file{0} != '.') && ($file{0} != '~') &&

(substr($file, -3) != 'LCK') && (substr($file, -3) != 'php') && (substr($file, -3) != 'jpg') &&

(substr($file, -3) != 'png') && (substr($file, -3) != 'gif') &&

($file != basename($_SERVER['PHP_SELF'])) ) {

// Guarda o nome do arquivo e dados completos de uma chamada

// à stat()

$files[$file] = stat($file);

}

}

 

// Fecha o diretório

$d->close();

 

// Agora vamos exibir o resultado em uma tabela

echo '<style>td { padding-right: 10px; }</style>';

echo '<table><caption>Conteúdo deste diretório:</caption>';

 

// Ordenar os arquivos em ordem alfabética

ksort($files);

 

// Definir o horário brasileiro:

date_default_timezone_set('Brazil/East');

 

// Percorremos os arquivos, exibindo uma nova linha na tabela

// para cada um deles.

 

foreach ($files as $name => $stats) {

//$name = preg_replace('/\.[^.]*$/', '', $name); (aqui tentei fazer com que o arquivo aparecesse sem a extensão, funcionou, mas se clicar no link depois, não encontra nada)

// Inicia a linha e exibe um link com o nome do arquivo

echo "<tr><td><a href=\"{$name}\">{$name}</a></td>\n";

 

// Uma célula com o tamanho do arquivo

echo "<td align='right'>{$stats['size']}</td>\n";

// Uma coluna com a data de criação do arquivo

echo '<td>', date('d/m/Y h:ia', $stats['mtime']), "</td></tr>\n";

}

 

echo '</table>';

?>

 

Daí em diante começa o meu problema!

O código exibe os arquivos que eu quero como links, mas mostra a extensão e eu queria que não mostrasse, deixando apenas o nome do arquivo.

Onde eu comentei em vermelho eu tentei fazer com que não mostre a extensão e deu certo, mas quando você clica no link, dá erro pois como o link criado é sem extensão nenhuma, não existe no servidor e aí dá uma página de erro.

O que eu queria conseguir fazer é o seguinte:

 

Listar os arquivos, somente com as extensões que eu quero - isso já deu certo

 

Listar os arquivos e exibir em forma de links - isso já deu certo

 

Listar os arquivos, escondendo a extensão, deixando só o nome do arquivo - isso não deu certo ainda

 

Exibir o arquivo, sem a extensão, em forma de link e abrindo em uma nova janela quando for clicado isso não deu certo ainda

 

Esta seria a primeira parte.

 

Conseguindo fazer isto, eu gostaria da ajuda de vocês para o seguinte:

 

Os arquivos que vão aparecer na listagem, são todos ".txt".

 

Com vários campos de texto em cada um deles.

 

Então, eu queria fazer com que ao clicar no link gerado, a nova página que abrisse, pegasse os dados deste txt que foi clicado, mas exibisse os dados dele por exemplo, da 10ª linha em diante.

Sei que da pra fazer isso mas não sei como fazer.

 

Então é isso se alguém puder dar uma forcinha nisso eu fico agradecida.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite, GiSP.

 

Se possível, da próxima vez, diga-nos o erro que ocorre ao executar o seu script. Mas enfim, dei uma mexida por cima no seu script. Por favor, teste e diga-me se funcionou:

<?
// Define um array para armazenar os arquivos
$files = array();

// Diretório atual
$d = dir('.');

// Percorre todos os arquivos
while(false !== ($file = $d->read())){
// Se o arquivo não é este arquivo, e não começa com "." ou "~"
// e não termina em LCK, então guarde-o para exibição futura.
if(($file{0} != '.') && ($file{0} != '~') &&
(substr($file, -3) != 'LCK') && (substr($file, -3) != 'php') && (substr($file, -3) != 'jpg') &&
(substr($file, -3) != 'png') && (substr($file, -3) != 'gif') && 
($file != basename($_SERVER['PHP_SELF'])) ) {
// Guarda o nome do arquivo e dados completos de uma chamada
// à stat()
$files[$file] = stat($file);
}
}

// Fecha o diretório
$d->close();

// Agora vamos exibir o resultado em uma tabela
echo '<style>td { padding-right: 10px; }</style>';
echo '<table><caption>Conteúdo deste diretório:</caption>';

// Ordenar os arquivos em ordem alfabética
ksort($files);

// Definir o horário brasileiro:
date_default_timezone_set('Brazil/East');

// Percorremos os arquivos, exibindo uma nova linha na tabela
// para cada um deles.

foreach ($files as $name => $stats) {
//$name = preg_replace('/\.[^.]*$/', '', $name);
// Inicia a linha e exibe um link com o nome do arquivo
echo "<tr><td><a href=\"{$files}\">{$name}</a></td>\n";

// Uma célula com o tamanho do arquivo
echo "<td align='right'>{$stats['size']}</td>\n";
// Uma coluna com a data de criação do arquivo
echo '<td>', date('d/m/Y h:ia', $stats['mtime']), "</td></tr>\n";
}

echo '</table>';
?>

 

Com relação a segunda dúvida você quer que apareça o arquivo txt, mas que só exiba o conteúdo a partir da 10ª linha? É isso?

 

Abraços! ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Imaginando o seguinte txt:

linha1
linha2
linha3
linha4
linha5
linha6
linha7
linha8
linha9
linha10
linha11
linha12
linha13
linha14
linha15

 

Código:

<?php
       echo '<pre>';
       foreach( glob( '*.txt' ) as $file ){
               $fp = fopen( $file, 'r+' );
               while( $data = fscanf( $fp, '%s' ) ){
                      $contents[] = reset( $data );
               }
       }
       print_r( $contents );
       for( $i = 10; $i < count( $contents ); ++$i ){
            echo $contents[$i], '<br />';
       }
?>

 

Saída:

Array
(
   [0] => linha1
   [1] => linha2
   [2] => linha3
   [3] => linha4
   [4] => linha5
   [5] => linha6
   [6] => linha7
   [7] => linha8
   [8] => linha9
   [9] => linha10
   [10] => linha11
   [11] => linha12
   [12] => linha13
   [13] => linha14
   [14] => linha15
)
linha11
linha12
linha13
linha14
linha15

 

 

Agora se você trabalha com uma grande quantidade de arquivos, e precise identificar aonde se encontra tal linha, você pode fazer o seguinte:

 

<?php
       echo '<pre>';
       foreach( glob( '*.txt' ) as $file ){
               $fp = fopen( $file, 'r+' );
               while( $data = fscanf( $fp, '%s' ) ){
                      $contents[$file][] = reset( $data );    
               }  
                $files[] = $file;
       }
       foreach( $files as $file ){
            for( $i = 10; $i < count( $contents[$file] ); ++$i ){
                 echo $contents[$file][$i], '<br />';
            }
       }

 

Saída:

Array
(
   [arquivo.txt] => Array
       (
           [0] => linha1
           [1] => linha2
           [2] => linha3
           [3] => linha4
           [4] => linha5
           [5] => linha6
           [6] => linha7
           [7] => linha8
           [8] => linha9
           [9] => linha10
           [10] => linha11
           [11] => linha12
           [12] => linha13
           [13] => linha14
           [14] => linha15
       )

   [arquivo_1.txt] => Array
       (
           [0] => linha1
           [1] => linha2
           [2] => linha3
           [3] => linha4
           [4] => linha5
           [5] => linha6
           [6] => linha7
           [7] => linha8
           [8] => linha9
           [9] => linha10
           [10] => linha11
           [11] => linha12
           [12] => linha13
           [13] => linha14
           [14] => linha15
       )

)
arquivo.txt
linha11
linha12
linha13
linha14
linha15

arquivo_1.txt
linha11
linha12
linha13
linha14
linha15

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi gente!

 

Vcs são rapidos hein!

 

Kaminari, testei sua modificação e acontece que a idéia é não mostrar a extensão do arquivo e está mostrando do mesmo jeito.

 

Por exemplo, tenho no diretório o arquivo:

 

meuexemplo.txt

 

Quero que ele seja exibido apenas assim:

meu exemplo

 

Mas em formato de link, que ao ser clicado, consiga abrir o arquivo numa nova janela.

 

Na sua alteração, continua mostrando a extensão do arquivo e ao ser clicado, não consegue abrir nada, pois tenta abrir o que mostra na barra de status apenas:

 

 

O que eu gostaria é que, os arquivos fossem listados, mas escondendo a extensão de cada um, em formato de link, para que quando for clicado, abra numa nova janela este arquivo.

 

Neste meu diretório, todos os arquivos são ".txt":

 

meuexemplo_01.txt

meuexemplo_02.txt

meuexemplo_03.txt

meuexemplo_04.txt

 

Com vários campos de texto em cada um deles.

 

Então, eu queria fazer com que ao clicar no link gerado, a nova página que abrisse, conseguisse pegar os dados deste link que foi clicado referente ao txt que está sendo listado como link e sem a extensão. Ao carregar esta página que foi clicada pelo link, exibisse os dados dele por exemplo, da 10ª linha em diante.

 

Não sei como fazer isto, se é colocando um onclick no link chamando uma página php que vai ler o arquivo da linha 10 em diante e exibir.

 

Na verdade é esta minha idéia mesmo, de listar os arquivos como links, mas sem a extensão, colocando um onclick ou alguma coisa, que chame uma página php, que vai conseguir ler este arquivo do link da linha 10 em diante, pois assim eu posso personalizar esta página chamada colocando um header e outras coisinhas pra deixar a página mais atraente.

 

Então é isso, não sei se consegui ser clara o suficiente, basicamente é isso que estou tentando fazer mesmo.

 

Fico agradecida pela ajuda mesmo!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tá, apenas o link para cada arquivo TXT no dir ?

<?php
       echo '<pre>';
       foreach( glob( 'seudiretorio/*.txt' ) as $file ){
               echo '<a href="http://localhost/meuteste/'.$file.'">', $file, '</a><br />';
       }

 

Saída:

<a href="http://localhost/meuteste/arquivo.txt">arquivo.txt</a><br />
<a href="http://localhost/meuteste/arquivo_1.txt">arquivo_1.txt</a><br />

Compartilhar este post


Link para o post
Compartilhar em outros sites

GiSP, tentamos ser sempre os mais rápidos possíveis. :clap:

 

Mas enfim, vamos novamente ao seu problema...

o que acontece é a duplicação de extensão... ele dá erro porque o que está sendo aplicado no seu <a href="#"></a> é o arquivo sem a extensão (.txt).

 

Tente fazer o seguinte, então:

echo "<tr><td><a href=\"{$name}\".txt>{$name}</a></td>\n";

 

Quanto a segunda dúvida, o primeiro post do Andrey pode te ajudar, é só fazer algumas modificações.

 

Abraços! ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi Kaminari,

 

Então, conseguir listar os arquivos como links mostrando a extensão eu consigo normalmente, era assim mesmo que ele estava mostrando no código que coloquei primeiro.

 

Mas o que eu queria saber é justamente se dá pra exibir como link sem a extensão, mas que ao ser clicado, mostre o arquivo em uma nova janela de alguma forma.

 

Já quebrei a cabecinha pesquisando isso!

 

Aí depois, na parte que vai exibir como link o arquivo listado, é onde eu queria fazer o que falei do link, quando for clicado, chamar uma página, onde vai exibir o arquivo a partir da linha 10, etc.

 

O código originalmente era assim:

 

<?

// Define um array para armazenar os arquivos

$files = array();

 

// Diretório atual

$d = dir('.');

 

// Percorre todos os arquivos

while(false !== ($file = $d->read())){

// Se o arquivo não é este arquivo, e não começa com "." ou "~"

// e não termina em LCK, então guarde-o para exibição futura.

 

if(($file{0} != '.') && ($file{0} != '~') &&

(substr($file, -3) != 'LCK') && (substr($file, -3) != 'php') && (substr($file, -3) != 'jpg') &&

(substr($file, -3) != 'png') && (substr($file, -3) != 'gif') &&

($file != basename($_SERVER['PHP_SELF'])) ) {

// Guarda o nome do arquivo e dados completos de uma chamada

// à stat()

$files[$file] = stat($file);

}

}

 

// Fecha o diretório

$d->close();

 

// Agora vamos exibir o resultado em uma tabela

echo '<style>td { padding-right: 10px; }</style>';

echo '<table><caption>Conteúdo deste diretório:</caption>';

 

// Ordenar os arquivos em ordem alfabética

ksort($files);

 

// Definir o horário brasileiro:

date_default_timezone_set('Brazil/East');

 

// Percorremos os arquivos, exibindo uma nova linha na tabela

// para cada um deles.

 

foreach ($files as $name => $stats) {

// Inicia a linha e exibe um link com o nome do arquivo

echo "<tr><td><a href=\"{$name}\">{$name}</a></td>\n";

 

// Uma célula com o tamanho do arquivo

echo "<td align='right'>{$stats['size']}</td>\n";

// Uma coluna com a data de criação do arquivo

echo '<td>', date('d/m/Y h:ia', $stats['mtime']), "</td></tr>\n";

}

 

echo '</table>';

?>

 

Se testar este aí, vai ver que ele exibe certinho os arquivos como links, mas mostrando a extensão e aí quando você clica, abre sem problema o arquivo txt.

 

Minha idéia é não aparecer a extensão, mas ao clicar, conseguir abrir este arquivo numa nova janela, exibindo ele, da linha 10 em diante.

É onde veio a minha idéia de na parte do script que chama o link, colocar alguma coisa, que chame uma página php, que vai ler o arquivo texto do link e exibir ele da linha 10 em diante.

 

Ai, não sei se estou sendo clara, até eu já to doidinha :blush:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, GiSP. Aos poucos eu vou entender, hahaha. Desculpe, de início eu também não entendi.

 

Então assim, para você exibir o link sem a extensão final do arquivo, você deve utilizar o ReWrite no .htaccess. Creio que também seja possível com o PHP, mas não me vem à cabeça como.

 

Peguei este e este link para guiar você.

 

Se continuar tendo dúvidas, fale!

 

Abraços! ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi pessoal, obrigada pela ajuda, eu vou tentar fazer isso aí do htaccess pra ver se funciona e volto aqui pra dizer, bjinhos por enquanto :cheekkiss:

 

Oi pessoal, voltei! :D

 

Com a ajuda do amiguinho web de outro fórum, ele me passou uma solução bem mais simples do que a minha pra listar os arquivos txt sem mostrar a extensão:

 

<?php

// diretório onde estão os arquivos

$dir = ".";

 

// *.txt são os formatos de arquivos a serem alterados

foreach (glob("$dir/*.txt") as $arquivo) {

$p1 = explode("/", $arquivo);

$p2 = explode(".", $p1[1]);

print "<a href=\"$arquivo\" target=\"_blank\">$p2[0]</a><br>";

}

 

?>

 

Esse código funcinou certinho, não exibe a extensão do arquivo no link e ao ser clicado o link abre certinho na outra janela.

 

Acho que essa parte ficou bem legal.

 

Ele deu esta idéia abaixo pra ler o txt a partir da linha tal e exibir ele na tela:

 

$file = "arquivo...";

$linha = explode("\n",file_get_contents($file));

for($i = 0; $i < count($linha); $i++) {

$i < 5 ? "" : print($linha[$i])."<br />";

}

 

5 é o número de linhas que será ignorada a partir do início do arquivo.

 

Mas agora, entra aquele outro negócio de o link que aparece, ao ser clicado já ser exibido na nova página php a partir da linha tal.

 

Tipo assim:

 

Link que aparece na listagem -> meuexemplo (referente ao meuexemplo.txt)

 

Quando clicar nele, ele abrir na outra janela já na página php lendo das linhas em diante.

 

Acho que é isso a idéia mas não sei se dá pra fazer isso, pois seria automatico, clicou no link, abriu a página já lendo o arquivo que o link se refere da linha tal em diante.

 

Aí não sei se dá pra fazer um onclick aqui:

 

print "<a href=\"$arquivo\" target=\"_blank\">$p2[0]</a><br>";

 

Com algum comando que faça este link, gerar uma nova página já lendo o arquivo que ele apontou.

 

Será que dá?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.