h.udo Posted February 13, 2014 at 01:15 PM Report #545141 Posted February 13, 2014 at 01:15 PM (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 February 13, 2014 at 09:49 PM by h.udo
HappyHippyHippo Posted February 13, 2014 at 01:39 PM Report #545142 Posted February 13, 2014 at 01:39 PM (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 February 13, 2014 at 01:39 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
h.udo Posted February 13, 2014 at 03:03 PM Author Report #545149 Posted February 13, 2014 at 03:03 PM 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
HappyHippyHippo Posted February 13, 2014 at 06:00 PM Report #545180 Posted February 13, 2014 at 06:00 PM porque disse ao BB que linguagem a apresentar: [ code=php] [ /code] (sem espaços) IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
h.udo Posted February 13, 2014 at 10:00 PM Author Report #545209 Posted February 13, 2014 at 10:00 PM Yap, tinha que ser idiotice minha! PO alterado para melhor leitura. Abraço, h.udo
h.udo Posted February 16, 2014 at 10:19 PM Author Report #545513 Posted February 16, 2014 at 10:19 PM 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
h.udo Posted February 17, 2014 at 05:19 PM Author Report #545576 Posted February 17, 2014 at 05:19 PM (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 February 17, 2014 at 05:20 PM by h.udo
Rui Carlos Posted February 21, 2014 at 12:33 AM Report #546006 Posted February 21, 2014 at 12:33 AM 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. Rui Carlos Gonçalves
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now