Jump to content

Retornar lista de ficheiros como url


Recommended Posts

Posted (edited)

Boas.

Estou a tentar alterar um script para me dar uma lista de ficheiros, em determinada directoria de um servidor FTP, como url.

# the directory where ftp_rawlist starts
$startdir = "/videolan/x264/binaries/win32/";
# optional Datatypefilter (leave blank if not needed)
$suffix = "exe";
# ftp-login
$ftp_server = "ftp.fau.de";
$ftp_user = "anonymous";
$ftp_pw	 = "";
$ftp_mode = "";
$conn_id = ftp_connect($ftp_server);
ftp_login($conn_id, $ftp_user, $ftp_pw) OR die("<br>ftp-login failed");
ftp_pasv($conn_id, true);
#*********************************************************************
# create filelist (recursiv)
#*********************************************************************
$files = array(); # must be defined here
$files = raw_list("$startdir");
#*********************************************************************
# print result
#*********************************************************************
$i = 0; $count = count($files);
while ($i < $count):
# echo "$ftp_server$files[$i]<br>"; # echo original
echo '<a href="'.$ftp_server.''.$files[$i].'">'.$files[$i].'</a><br>';
$i++;
endwhile;
ftp_close($conn_id);
#*********************************************************************
# rawlist in recursive form (without parameter true!!!)
#*********************************************************************
function raw_list($folder)
{
Global $conn_id;
Global $suffix;
Global $files;
$suffixes = explode(",", $suffix);
$list	 = ftp_rawlist($conn_id, $folder);
$anzlist = count($list);
$i = 0;
while ($i < $anzlist):
$split = preg_split("/[\s]+/", $list[$i], 9, PREG_SPLIT_NO_EMPTY);
$ItemName = $split[8];
$endung = strtolower(substr(strrchr($ItemName,"."),1));
$path	 = "$folder$ItemName";
if (substr($list[$i],0,1) === "d" AND substr($ItemName,0,1) != "."):
#	 array_push($files, $path); # write directory in array if desired
 raw_list($path);
elseif (substr($ItemName,0,2) != "._" AND in_array($endung,$suffixes)):
 array_push($files, $path);
endif;
$i++;
endwhile;
return $files;
}

Infelizmente, apesar de ter alterado o echo no loop, continua a formatar mal o url.

O url gerado e apresentado na página é este:

<a href="ftp.fau.de/videolan/x264/binaries/win32/x264-r2389-956c8d8.exe">/videolan/x264/binaries/win32/x264-r2389-956c8d8.exe</a>

Mas, inspecionando com o firebug, consigo ver que na realidade o url aponta para

<a href="example.com/ftp.fau.de/videolan/x264/binaries/win32/x264-r2389-956c8d8.exe">/videolan/x264/binaries/win32/x264-r2389-956c8d8.exe</a>

o que resulta em erro quando se clica para fazer download porque está a adicionar o siteurl do domínio onde o script está a correr.

O segundo erro é que apenas quero ter no link o nome do ficheiro, sem a directoria onde está alojado, mas não consigo "convencer" o echo a isso.

Sugestões?

Abraço

h.udo

Edited by h.udo
Posted (edited)

o que resulta em erro quando se clica para fazer download porque está a adicionar o siteurl do domínio onde o script está a correr.

adiciona o protocolo (http ou ftp, não sei qual queres usar)

echo '<a href="ftp://'.$ftp_server.$files[$i].'">'.$files[$i].'</a><br>';

O segundo erro é que apenas quero ter no link o nome do ficheiro, sem a directoria onde está alojado, mas não consigo "convencer" o echo a isso.

echo '<a href="ftp://'.$ftp_server.$files[$i].'">'.basename($files[$i]).'</a><br>';
Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Posted

Obrigado!

Já tinha andado a tentar com o basename adicionado mas devo ter cometido algum erro na syntax porque não me dava o resultado pretendido. Falta de experiência é o que dá.

Quanto ao resto, nem me lembrei que podia ser por não estar a especificar o protocolo.

Porque é que o teu BBCode tem syntax highlight é o meu não?

Abraço,

h.udo

Posted

Boas!

Espero que o fim-de-semana esteja a ser agradável para todos.

Mais algumas dúvidas:

Lembrei-me de adicionar um mecanismo de cache para não estar constantemente a martelar o servidor sempre que alguém vê a página ou faz um refresh. A forma mais simples que me ocorreu é gravar a info num ficheiro, a cada 24h, depois de correr o script com o cron. Aquando da geração da página, insiro a info com

echo file_get_contents("ficheiro.txt");
Até aqui tudo bem. O problema é que não consigo gravar o ficheiro com o url enconding como está no script usando o resultado que me dá com
return $files;
Até agora as minhas tentativas incluem:
file_put_contents("teste_1.txt",serialize($files));
com o resultado abaixo
a:12:{i:0;s:56:"/videolan/x264/binaries/win32/x264-10b-r2345-f0c1c53.exe";i:1;s:56:"/videolan/x264/binaries/win32/x264-10b-r2356-a1d3d17.exe";i:2;s:56:"/videolan/x264/binaries/win32/x264-10b-r2357-e61d9f9.exe";i:3;s:56:"/videolan/x264/binaries/win32/x264-10b-r2358-9e941d1.exe";i:4;s:56:"/videolan/x264/binaries/win32/x264-10b-r2377-1ca7bb9.exe";i:5;s:56:"/videolan/x264/binaries/win32/x264-10b-r2389-956c8d8.exe";i:6;s:52:"/videolan/x264/binaries/win32/x264-r2345-f0c1c53.exe";i:7;s:52:"/videolan/x264/binaries/win32/x264-r2356-a1d3d17.exe";i:8;s:52:"/videolan/x264/binaries/win32/x264-r2357-e61d9f9.exe";i:9;s:52:"/videolan/x264/binaries/win32/x264-r2358-9e941d1.exe";i:10;s:52:"/videolan/x264/binaries/win32/x264-r2377-1ca7bb9.exe";i:11;s:52:"/videolan/x264/binaries/win32/x264-r2389-956c8d8.exe";}
 
$ficheiro = fopen("teste_2.txt", "w");
fwrite($ficheiro, print_r($files, TRUE));
fclose($ficheiro);
resulta num dump do array
Array
(
[0] => /videolan/x264/binaries/win32/x264-10b-r2345-f0c1c53.exe
[1] => /videolan/x264/binaries/win32/x264-10b-r2356-a1d3d17.exe
[2] => /videolan/x264/binaries/win32/x264-10b-r2357-e61d9f9.exe
[3] => /videolan/x264/binaries/win32/x264-10b-r2358-9e941d1.exe
[4] => /videolan/x264/binaries/win32/x264-10b-r2377-1ca7bb9.exe
[5] => /videolan/x264/binaries/win32/x264-10b-r2389-956c8d8.exe
[6] => /videolan/x264/binaries/win32/x264-r2345-f0c1c53.exe
[7] => /videolan/x264/binaries/win32/x264-r2356-a1d3d17.exe
[8] => /videolan/x264/binaries/win32/x264-r2357-e61d9f9.exe
[9] => /videolan/x264/binaries/win32/x264-r2358-9e941d1.exe
[10] => /videolan/x264/binaries/win32/x264-r2377-1ca7bb9.exe
[11] => /videolan/x264/binaries/win32/x264-r2389-956c8d8.exe
)
E o mais próximo que estou do resultado pretendido é com
$ficheiro = implode("\n", $files);
file_put_contents("teste_3.txt", $ficheiro);
mas o encoding do url perde-se pelo caminho, incluíndo o início do url - ftp://ftp.fau.de
/videolan/x264/binaries/win32/x264-10b-r2345-f0c1c53.exe
/videolan/x264/binaries/win32/x264-10b-r2356-a1d3d17.exe
/videolan/x264/binaries/win32/x264-10b-r2357-e61d9f9.exe
/videolan/x264/binaries/win32/x264-10b-r2358-9e941d1.exe
/videolan/x264/binaries/win32/x264-10b-r2377-1ca7bb9.exe
/videolan/x264/binaries/win32/x264-10b-r2389-956c8d8.exe
/videolan/x264/binaries/win32/x264-r2345-f0c1c53.exe
/videolan/x264/binaries/win32/x264-r2356-a1d3d17.exe
/videolan/x264/binaries/win32/x264-r2357-e61d9f9.exe
/videolan/x264/binaries/win32/x264-r2358-9e941d1.exe
/videolan/x264/binaries/win32/x264-r2377-1ca7bb9.exe
/videolan/x264/binaries/win32/x264-r2389-956c8d8.exe
Duas perguntas:

O array não guarda o valor completo do echo inicial? Do tipo

<a href="ftp://ftp.fau.de/videolan/x264/binaries/win32/x264-r2389-956c8d8.exe">x264-r2389-956c8d8.exe</a>
Como posso gravar para o ficheiro sem perder o encoding do url? Ou refazer o url encoding aquando da gravação para o ficheiro?

Abraço,

h.udo

Posted (edited)

Boas!

Depois de muito olhar para o script resolvi começar de novo. Entre outras razões, para ver se conseguia simplificar o código e perceber melhor o que estava a acontecer, já que (ainda) não percebo completamente o código.

Durante o processo de reescrever e simplificar, percebi o que estava a fazer mal no script acima e cheguei a duas soluções, com muito menos código.

Versão com echo para o screen

# login details
$ftp_server = "ftp.fau.de";
$ftp_user   = "anonymous";
$ftp_pw	 = "anonymous";

# folder to list files
$startdir = "/videolan/x264/binaries/win32/";

$conn = ftp_connect($ftp_server) or die("<br>FTP Server not found!");
ftp_login($conn, $ftp_user, $ftp_pw) or die("<br>FTP Login failed!");

$raw = ftp_nlist($conn, $startdir);
ftp_close($conn);

foreach($raw AS $files){
 if(substr($files, 0, 1) != '.' && strpos($files, '.')){
echo '<a href="ftp://'.$ftp_server.$files.'">'.basename($files).'</a><br>';
 }
}

Versão com gravação para ficheiro

# login details
$ftp_server = "ftp.fau.de";
$ftp_user   = "anonymous";
$ftp_pw	 = "anonymous";

# folder to list files
$startdir = "/videolan/x264/binaries/win32/";

# file name to save list
$filename = "ficheiros.txt";

$conn = ftp_connect($ftp_server) or die("<br>FTP Server not found!");
ftp_login($conn, $ftp_user, $ftp_pw) or die("<br>FTP Login failed!");

$raw = ftp_nlist($conn, $startdir);
ftp_close($conn);

foreach($raw AS $files){
 if(substr($files, 0, 1) != '.' && strpos($files, '.')){
$fp = fopen($filename, "a");
  fwrite($fp, print_r('<a href="ftp://'.$ftp_server.$files.'">'.basename($files).'</a><br>', TRUE));
fclose($fp);
 }
}

Próximo passo, detectar se o ficheiro de gravação existe. Se existir, renomear para ficheiros.bak e gravar o novo ficheiro.

Sugestões para melhorar o script?

Abraço,

h.udo

Edited by h.udo
Posted

Um conselho que se costumava dar em PHP (que não sei se ainda é válido) passava por usar echo '<a href="ftp://', $ftp_server, $files, '">', basename($files), '</a><br>'; em vez de echo '<a href="ftp://'.$ftp_server.$files.'">'.basename($files).'</a><br>';.

Na segunda script, o fopen e o fclose deviam estar fora da script. Não faz sentido estares constantemente a abrir e a fechar o ficheiro (certifica-te também que não terás problemas de concorrência no acesso ao ficheiro).

Adicionalmente, eu escreveria apenas no ficheiro o $files. O resta geraria na script. talvez seja menos eficiente, mas é mais abstracto.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.