Práce s FTP v PHP

31. května 2007

V tomto článku se naučíme pracovat s FTP v PHP a ukážeme si nějaké praktické příklady použití této extension. Ke konci článku se budeme také zabývat SSL-FTP.

Jelikož extension FTP je obsaženo přímo v balíku PHP, ušetřili nám vývojáři hodně práce tím, že nemusíme stahovat nic dodatečného kromě samotného PHP.

Instalace extension FTP do PHP – Linux

Protože předpokládáme, že si PHP budeme na serveru, kde máme blíže neurčenou distribuci GNU/Linuxu, sami kompilovat ze zdrojových kódů, uvažujeme následující obecný postup:

  1. ./configure –enable-ftp
  2. make
  3. make install

Samozřejmě můžeme v příkazu ./configure použít více parametrů. Použijeme je, hlavně pokud chceme povolit další extensions nebo určit, kam se bude PHP instalovat. To ale záleží na každém, co bude potřebovat… Další možné parametry tohoto příkazu a zároveň manuál k instalaci PHP naleznete v dokumentaci PHP. Výše uvedený postup je tedy velmi zobecněný, protože instalace PHP není předmětem tohoto článku.

Po provedení tohoto postupu pak stačí většinou restartovat webserver (v případě, že PHP je již instalováno do webserveru) nebo učinit kroky, které zavedou podporu PHP do webserveru. V případě problému doporučuji prostudovat dokumentaci k vašemu webserveru nebo dokumentaci k PHP, kde jsou naznačeny postupy k instalaci PHP.

V případě, že někdo používá distribuční balík ze své distribuce GNU/Linuxu, tak jej bohužel musím odkázat na dokumentaci k tomuto balíku – distribucí je hodně a není možné napsat postup, který bude fungovat všude.

Instalace extension FTP do PHP – Windows

Na serverech s OS Microsoft Windows máme práci ještě více ulehčenu, zde většinou používáme přímo binární instalační balík a v něm je již tato extension obsažena.

Instalace z tohoto balíku je jednoduchá, klikací, a tudíž se jí nebudeme zabývat.

Spojení a práce s FTP v PHP

Pro začátek malá ukázka spojení s ošetřenými chybami:

<?
if(!$spojeni = ftp_connect(„mujserver.neco“)) {
  die(„Spojeni s FTP serverem selhalo!“);
}
/* Pokusíme se připojit k FTP serveru na FQDN „mujserver.neco“, v případě chyby vypíšeme chybovou hlášku a končíme další zpracování programu. */
if(!ftp_login($spojeni, „uzivatelske.jmeno“, „heslo“)) {
  echo(„Spatne jmeno, nebo heslo!“);
  ftp_close($spojeni);
  exit();
 }
/* Pokusíme se autentizovat jako uživatel „uzivatelske.jmeno“ s heslem „heslo“, v případě, že nám jej FTP server z nějakého důvodu odmítne, vypíšeme chybu, ukončíme spojení a také program. */
ftp_close($spojeni);
/* Po dokončené práci ukončíme spojení s FTP serverem. */
?>

Dále se pokusíme o upload souboru lok_soubor.txt, který máme uložený ve stejném adresáři jako PHP skript, který budeme spouštět. Soubor bude uploadován jako textový a na FTP serveru bude uložen pod názvem vzd_soubor.txt:

<?
$spojeni = ftp_connect(„mujserver.neco“);
/* Nejdříve se samozřejmě připojíme k FTP serveru. */
ftp_login($spojeni, „uzivatelske.jmeno“, „heslo“);
/* Dále se musíme autentizovat. */
if(!ftp_put($spojeni, „vzd_soubor.txt“, „lok_soubor.txt“, FTP_ASCII)) {
echo(„Chyba pri uploadovani souboru!“);
}
else {
  echo(„Soubor uploadovan!“);
}
/* Pokusíme se uploadovat soubor, v případě neúspěchu vracíme chybu, v případě úspěchu vypíšeme informaci o úspěšném uploadu. */
ftp_close($spojeni);
/* Po dokončené práci ukončujeme spojení s FTP serverem. */
?>

Teď se naopak pokusíme o download textového souboru vzd_soubor.txt z FTP serveru a uložíme jej lokálně jako lok_soubor.txt. Jelikož se jedná jen o malou změnu oproti předchozí ukázce, tak pouze nahradíme tento zápis…

if(!ftp_put($spojeni, „vzd_soubor.txt“, „lok_soubor.txt“, FTP_ASCII)) {
  echo(„Chyba pri uploadovani souboru!“);
}
else {
  echo(„Soubor uploadovan!“);
}

…tímto zápisem:

if(!ftp_get($spojeni, „lok_soubor.txt“, „vzd_soubor.txt“, FTP_ASCII)) {
  echo(„Chyba pri downloadovani souboru!“);
}
else {
  echo(„Soubor downloadovan!“);
}

Když už umíme soubory uploadovat a downloadovat, můžeme si vyzkoušet funkci pro mazání souborů. (Tato ukázka musí být vložena někde do programu, kde existuje funkční spojení s FTP serverem.) Pokusíme se smazat soubor vzd_soubor.txt:

if (!ftp_delete($spojeni, „vzd_soubor.txt“)) {
  echo(„Chyba pri mazani souboru!“);
}
else {
  echo(„Soubor uspesne smazan!“);
}

Když se vrátíme k předchozím příkladům a zamyslíme se, uvědomíme si, že soubor vzd_soubor.txt umístěný na FTP serveru mohl mít klidně několik desítek MB a určitě by bylo vhodné znát před samotným stažením jeho velikost. Toho dosáhneme tím, že do programu s existujícím, funkčním spojením s FTP serverem vřadíme něco v tomto smyslu:

$velikost = ftp_size($spojeni, vzd_soubor.txt);
if ($velikost != -1) {
  echo(„Velikost souboru je $velikost bajtu!“);
}
else {
  echo(„Nelze zjistit velikost souboru!“);
}

Tímto jsme docílili toho, že se nám vypíše velikost souboru vzd_soubor.txt v bajtech.

Protože funkcí obsažených v této extension je opravdu hodně, ukážeme si už jen ve zkrácené podobě několik funkcí pro práci s adresáři a na ošetření chyb se nebudeme ohlížet, pouze dodržíme pravidlo, že tyto funkce použijeme při funkčním spojení s FTP serverem:

ftp_mkdir($spojeni, „novaslozka“); // Vytváří nový adresář „novaslozka“
ftp_rmdir($spojeni, „novaslozka“); // Maže adresář „novaslozka“
ftp_chdir($spojeni, „novaslozka“); // Vstoupí do adresáře „novaslozka“
ftp_pwd($spojeni); // Vstoupí do adresáře „/“, tedy do hlavního, nejvyššího…

FTP kontra SSL-FTP

Jelikož FTP komunikuje zcela nezabezpečeně, bylo by přinejmenším vhodné u důležitějších projektů využít SSL-FTP, který svůj provoz šifruje. Je nutná jak podpora ze strany FTP serveru, tak ze strany námi používaného PHP. Pokud jsme při kompilaci PHP zvolili, že bude k dispozici OpenSSL, můžeme využívat výhod SSL-FTP. Pokud ne, nezbývá, než tuto podporu přidat – problematiku integrace OpenSSL do PHP doporučuji „konzultovat“ s dokumentací PHP. Pokud FTP server, kam se připojujeme, nepovoluje SSL-FTP, máme možnost požádat správce tohoto FTP serveru, aby tuto funkci povolil – nemusí nám sice vyhovět, ale za pokus nic nedáme. (Pokud se jedná o náš FTP server, podíváme se do jeho dokumentace a zaměříme se na problematiku SSL.)

Jak tedy na SSL-FTP spojení? Zcela jednoduše a to následujícím příkazem:

ftp_ssl_connect(„mujserver.neco“);

Tímto jsme se pokusili připojit k SSL-FTP, samozřejmě můžeme ošetřit chyby a v případě neúspěchu se pokusit připojit nezabezpečenou metodou. Další práce i v případě použití SSL-FTP pokračuje úplně stejně jako u FTP, názvy funkcí jsou tedy dále shodné.

Protože ještě stále existuje řada funkcí, které jsme neprobrali, doporučuji vám dostudovat v dokumentaci FTP Functions. K nalezení jsou tam zejména funkce pro práci s právy souborů, vypsání souborů v adresáři a podobně.

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

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

Předchozí článek mnich.org
Další článek strecha-hyrak.cz
Štítky: Články

Mohlo by vás také zajímat

Nejnovější

4 komentářů

  1. krite-rium

    Čvc 18, 2009 v 19:57

    Mali by ste tu dat nejaky PHP kod ktory skopirujem na stranku a bude v nom jasne napisane:
    asofdefpiojeafijeijfijg (tuto hatlaninu zmen na adresu kde sa budu nahravat subory) alebo nieco podobne :)
    potrebujem to tam lebo ja sa s tych vsetkych xy zblaznim

    Odpovědět
  2. Vojtěch Zíka

    Lis 9, 2010 v 9:02

    Dyť to tam napsaný je:

    „Dále se pokusíme o upload souboru lok_soubor.txt, který máme uložený ve stejném adresáři jako PHP skript, který budeme spouštět.“

    if(!ftp_put($spojeni, „vzd_soubor.txt“, „lok_soubor.txt“, FTP_ASCII)) {
    echo(„Chyba pri uploadovani souboru!“);
    }

    Pokud to chceš dát do jinýho adresáře, uprav „lok_soubor.txt“ třeba na „soubory/lok_soubor.txt“

    Odpovědět
  3. GamerX

    Říj 7, 2013 v 20:56

    Jak ctu tak ctu ale nenasel jsem co jsem hledal slo by nejakým spusobem ten doubot ve FTP jen upravit treba pridat do souboru nejaky text a ulozit?

    Odpovědět
  4. R3sidento

    Úno 2, 2018 v 10:53

    Mě to vrací stále chybu

    Warning: ftp_put(lok_soubor.txt): failed to open stream: No such file or directory

    Přitom soubor exituje.

    Odpovědět

Napsat komentář

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