FTP klient v PHP snadno a rychle

12. ledna 2002

Chcete do svého projektu integrovat FTP klienta a nevíte, jak na to? V tomto článku vám přiblížím již vytvořenou komponentu, kterou lze upravovat podle vlastních požadavků.

Jistě to znáte sami – termín dodání projektu se blíží a vám se nechce programovat funkce, které už někdo udělal. Řešením je využití knihoven hotových skriptů jako např. HotScripts.com či php.ResourceIndex.com. Na těchto stránkách najdete více či méně podařené komponenty, které můžete vcelku snadno integrovat do svých programů.

V jedné z takových knihoven najdete i PHP FTP klienta, jehož autorem je Paul Southworth. Tento klient nabízí vedle možnosti uploadu a downloadu souborů i tvorbu adresářů na vzdáleném serveru – tedy skoro vše, co od jednoduchého klienta můžete chtít. Chyběla mi ale možnost mazání souborů a adresářů na vzdáleném serveru. Pustil jsem se tedy do úprav.

Nejprve si otevřete zdrojový text komponenty, který jsem z prostorových důvodů do článku nevložil. Po spuštění si program ověří, jakou hodnotu má proměnná $function – dle toho zavolá příslušnou funkci (její název začíná vždy řetezcem phpftp). Pokud je hodnota proměnné $function rovna prázdnému řetezci (počáteční stav), je zavolána funkce phpftp_login. Dojde tak k zobrazení formuláře pro doplnění údajů nutných pro připojení k serveru – tj. jména a hesla (adresa FTP serveru je napevno dána hodnotou proměnné $phpftp_host). Odesláním tohoto formuláře dojde k aktivaci funkce phpftp_list, která již zobrazí vlastního klienta. Dodejme, že všechny funkce si předávají hodnoty nutné pro připojení (jméno a heslo) jako parametr – z tohoto důvodu je u všech formulářů pro zasílání dat použita metoda POST (parametry se nezobrazí v řádku s adresou stránky). Není to sice nejlepší řešení (např. heslo lze snadno vyčíst ze zdrojového kódu stránky), avšak potenciální uživatel tyto hodnoty stejně znát musí a před připojením se k nim nikdo jiný dostat nemůže.

Jak už jsem zmínil v úvodu, funkce nabízené klientem mi nestačily. Jako první jsem přidal funkci pro smazání souboru: phpftp_del. Do funkce phpftp_list jsem doplnil další formulář zobrazující seznam souborů v aktuálním adresáři identický s tím, který je určen pro výběr souborů pro download (funkce phpftp_get). Změna spočívala pouze ve volání funkce phpftp_del. Vstupními parametry této funkce jsou vedle již zmiňovaných údajů nutných pro připojení (jméno a heslo uživatele) ještě řetězce s cestou k aktuálnímu adresáři a s názvem zvoleného souboru. Po připojení k FTP serveru se pomocí funkce ftp_chdir přesuňte do aktuálního adresáře a voláním funkce ftp_delete vybraný soubor smažte. Poté se odpojte od FTP serveru a zavolejte funkci phpftp_list, která slouží k vlastnímu zobrazení FTP klienta – tím zajistíte žádanou aktulizaci zobrazení stavu souborů na serveru.

function phpftp_del($phpftp_user,$phpftp_passwd,$phpftp_dir,$select_file) {
// Proběhlo připojení v pořádku?
if (!$ftp = @phpftp_connect($phpftp_user,$phpftp_passwd)) {
phpftp_top();
?>
<font color=“#ff0000″><strong>FTP login failed!</strong></font>
<a href=“ftp.php3″>Start over?</a>
<?php
phpftp_bottom();
}
else
{
// změna adresáře
ftp_chdir($ftp,$phpftp_dir);
// smazání souboru
ftp_delete($ftp,$phpftp_dir.“/“.$select_file);
// odpojení od FTP serveru
ftp_quit($ftp);
// znovunačtení klienta
phpftp_list($phpftp_user,$phpftp_passwd,$phpftp_dir);
}
}

Ve zdrojovém kódu jste si určitě všimli dvou funkcí, o kterých jsem se vůbec nezmiňoval – phpftp_top() a phpftp_bottom(). Jejich obsahem je záhlaví a zápatí stránky, v níž bude klient umístěn. Díky tomu lze snadno komponentu integrovat do aplikace.

Vedle možnosti smazání souboru mi chyběla ještě jedna funkce – smazání adresáře. Potřebný úsek kódu jsem doplnil do funkce phpftp_cd, která slouží pro přesun mezi adresáři. Využil jsem již naprogramovaný formulář, do kterého jsem doplnil tlačítko určené pro smazání adesáře. Formulář tak zůstane neměnný. Pouze při stisknutí doplněného tlačítka se navíc odešle řetezec $rmdir, který poté ve funkci poslouží pro indikaci žádosti o smazání adresáře. Pro zvýšení bezpečnosti jsem tuto funkci navíc doplnil o podmínku, která zajistí smazání adresáře pouze v případě zcela prázdného adresáře.

function phpftp_cd($phpftp_user,$phpftp_passwd,$phpftp_dir,$select_directory,$rmdir) {
?>
<?php
// Proběhlo připojení v pořádku?
$ftp = @phpftp_connect($phpftp_user,$phpftp_passwd);
// Chci smazat adresář? if ($rmdir)
{
// Je adresář prázdný?
if (sizeof(ftp_nlist($ftp,$phpftp_dir.“/“.$select_directory))==0)
{
// Proběhlo smazání v pořádku?
if (ftp_rmdir($ftp,$phpftp_dir.“/“.$select_directory))
{
?>
<font color=“#ff0000″><strong>Directory was removed</strong></font>
<?
// odpojení od FTP serveru
ftp_quit($ftp);
// znovunačtení klienta
phpftp_list($phpftp_user,$phpftp_passwd,$phpftp_dir);
}
}
else
{
?>
<font color=“#ff0000″><strong>Directory isn’t empty</strong></font>
<?
ftp_quit($ftp);
phpftp_list($phpftp_user,$phpftp_passwd,$phpftp_dir);
}
}
else
{
$new_directory=$phpftp_dir . „/“ . $select_directory;
phpftp_list($phpftp_user,$phpftp_passwd,$new_directory);
}
}

A to je vše. Vytvořený FTP klient splňuje všechny požadavky na něj kladené a modifikovaný kód je navíc možné snadno integrovat v podstatě do jakékoli aplikace. Konkrétně v případě mého redakčním systému jsem program doplnil o funkce pro kontrolu přístupu: klienta lze volat pouze v případě, že daný uživatel je přihlášen (blíže článek Autorizace uživatelů v PHP) a má k zobrazení klienta práva (kontrola záznamu v příslušné tabulce s právy uživatelů).

Původní zdrojový kód aplikace si můžete stáhnout zde, na Intervalu pak najdete popisovanou modifikaci v angličtině a v češtině.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *