Jednoduchý FTP klient v PHP 1.

13. února 2003

PHP obsahuje několik základních funkcí, určených pro práci s FTP serverem. V tomto článku si ukážeme jak je použít pro vytvoření jednoduchého FTP klienta, který nám umožní přístup k souborovému systému FTP serveru prostřednictvím webového prohlížeče.

Pomocí tohoto jednoduchého klienta budeme moci se souborovým systémem FTP serveru provádět následující úkony:

  • vytváření adresářů
  • mazání adresářů
  • zjišťování informací o adresářích (datum, atributy)
  • nahrávání souborů
  • mazání souborů
  • stahování souborů
  • zjišťování informací o souborech (velikost, datum, atributy)

Výhodou tohoto FTP klienta bude to, že vlastníkem adresářů a souborů jím vytvořených bude uživatel, pod kterým se dotyčný přihlásil na FTP server. Pokud bychom nepoužili PHP funkce pro práci s FTP serverem, ale pouze PHP funkce pro práci se soubory nebo adresáři (fopen, mkdir), pak by vlastníkem takto vytvořených souborů a adresářů byl uživatel, pod kterým běží PHP. Další problémy by mohly nastat v případě, že by webový server běžel v takzvaném bezpečném módu (SAFE MOD), který se využívá prakticky na všech serverech poskytujících webhosting. Například ve vytvořeném adresáři pak není většinou možno vytvářet podadresáře (může dojít k zamítnutí přístupu) atd. Tyto problémy řeší právě použití funkcí pro práci s FTP serverem.

Důležitým předpokladem pro správnou funkci dále popisovaných skriptů je zapnutá podpora FTP funkcí v PHP. Z výpisu funkce PHPInfo zjistíte, zda je na vašem webovém serveru tato podpora zapnuta. Mělo by v něm být uvedeno FTP support ? enabled. Také je důležitá zapnutá podpora takzvaných SESSION proměnných, do kterých budeme ukládat přihlašovací údaje, při přechodu mezi stránkami. Opět zjistíme z PHPInfo zda je Session support ? enabled. Pokud by server poskytující webhosting session proměnné nepodporoval, bylo by nutno předávání přihlašovacích údajů vyřešit jiným mechanismem, například předáváním v URL (nebezpečné) nebo ručním ukládáním do cookies (problém, pokud má uživatel podporu cookies vypnutou). O práci se sessions blíže pojednává článek Začínáme používat sessions v PHP.

Vlastní aplikace se bude skládat z následujících souborů a adresářů:

  • index.php – zobrazí stránku pro zadání přihlašovacích údajů
  • ftp.php – hlavní skript provádějící námi požadované operace se soubory a adresáři, také se stará o výpis obsahu aktuálního adresáře
  • funkce.php – soubor s definovanými funkcemi
  • nastaveni.php – konfigurační soubor
  • hlavicka.php – hlavička pro HTML stránky generované skripty
  • ftp.css – soubor pro definici stylu
  • img – adresář s ikonkami pro tzv. ?rozeznané? typy souborů (podle koncovky se zjistí, o jaký typ souboru jde, a u jeho jména se zobrazí příslušná ikonka)

Dříve než se pustíme do vlastního popisu obsahu jednotlivých souborů, bylo by dobré si vysvětlit funkci budoucí aplikace. Po zavolání stránky index.php se zobrazí přihlašovací formulář a po jeho odeslání se adresa FTP serveru, číslo portu, přihlašovací jméno a heslo uloží do session proměnné a provede se přesměrování na stránku ftp.php, která se postará o přihlášení k FTP serveru a zobrazí obsah aktuálního adresáře. Také se zobrazí formuláře pro zadání jména nového adresáře a pro zadání jména souboru, který budeme chtít nahrát na server. Dále je nabídnut odkaz pro odhlášení.

Soubor ftp.css

V tomto souboru je jen definice designu dokumentu (barvy, písma), na funkčnost aplikace nemá vliv.

body {
   font-size: 9pt;
   color: #000000;
   font-family: arial, helvetica, sans-serif;
   background-color: #f9f9f9;}
input {
   font-size: 7pt;}
td {
   font-size: 9pt;
   padding-right: 5px;
   padding-left: 5px;}
a {
   font-size: 9pt;
   text-decoration: none;}
a:hover {
   text-decoration: underline;}
.hlavicka {
   color: #ffffff;
   background-color: #888888;}
.adr {
   color: #000000;
   background-color: #dddddd;}
.sbr {
   color: #000000;
   background-color: #eeeeee;}
.chyba {
   color: #ff0000;
   background-color: #f9f9f9;}

Soubor hlavicka.php

Tento soubor obsahuje definici hlavičky HTML dokumentu, která je přidávána na začátek všech generovaných HTML stránek.

<!doctype html public „-//W3C//DTD HTML 4.0 Transitional//EN“>
<html>
<head>
   <title>Jednoduche FTP</title>
   <meta name=“description“ content=“Jednoduchy FTP klient v PHP“>
   <meta http-equiv=“Pragma“ content=“no-cache“>
   <meta http-equiv=“Expires“ content=“0″>
   <meta name=“robots“ content=“noindex“>
   <meta http-equiv=“content-type“ content=“text/html; charset=windows-1250″>
   <link rel=“STYLESHEET“ type=“text/css“ href=“ftp.css“>
</head>

Soubor nastaveni.php

V tomto souboru se provádí základní konfigurace FTP klienta.

<?
$program = „Jednoduchý FTP klient“;

Proměnná obsahuje název aplikace, který se zobrazí na stránce.

$anonymous = „anonymous“;
$anon = „anon@anon.com“;

Proměnná anonymous obsahuje přihlašovací jméno a proměnná anon obsahuje heslo. Tyto údaje se použijí v případě, že je uživatel nevyplní v přihlašovacím formuláři.

$poc_cesta = „“;

Proměnná poc_cesta obsahuje cestu k adresáři, jehož obsah se načte po přihlášení k FTP serveru.

$pracovni_adresar = „tempdir“;

Proměnná pracovni_adresar obsahuje název adresáře, do kterého budou ukládány dočasné soubory aplikace (při stahování souborů). V tomto adresáři musí mít PHP právo pro zápis!

$adresar_ikon = „img“;

Proměnná adresar_ikon obsahuje název adresáře, ve kterém jsou uloženy obrázky ikonek souborů.

$ikona_adresare = „adresar.gif“;
$ikona_neznama = „xyz.gif“;
$ikona_souboru = array();
$ikona_souboru[„doc“] = „doc.gif“;
$ikona_souboru[„pdf“] = „pdf.gif“;
$ikona_souboru[„js“] = „js.gif“;
$ikona_souboru[„zip“] = „zip.gif“;
$ikona_souboru[„jpg“] = „jpg.gif“;
$ikona_souboru[„css“] = „css.gif“;
$ikona_souboru[„htm“] = „html.gif“;
$ikona_souboru[„html“] = „html.gif“;
$ikona_souboru[„php“] = „php.gif“;
?>

Proměnná ikona_adresare obsahuje název souboru obrázku ikonky adresáře. Proměnná ikona_neznama obsahuje název souboru obrázku ikonky pro nerozeznané typy souborů. Pole ikona_souboru obsahuje názvy obrázků souborů ikonek, které aplikace rozeznává a přiřadí jim při výpisu příslušnou ikonku.

Soubor index.php

Stránka s formulářem pro zadání přihlašovacích údajů a skriptem pro zapsání údajů do session proměnných. Skript se také stará o odhlášení po ukončení práce.

<?
require(„nastaveni.php“);
if ($_GET[‚prikaz‘] == „odhlasit“) {
   session_start();
   session_destroy();
}

Připojíme soubor nastaveni.php a podle proměnné prikaz zjistíme, zda se nejedná o volání stránky za účelem odhlášení se od FTP serveru. Pokud ano, ukončíme session:

else {
   if (!Empty($_POST[‚form_ftpserver‘]) AND !Empty($_POST[‚form_port‘])) {
      session_start();
      $_SESSION[‚ftpserver‘] = $_POST[‚form_ftpserver‘];
      $_SESSION[‚port‘] = $_POST[‚form_port‘];
      if (Empty($_POST[‚form_jmeno‘]))
         $_SESSION[‚jmeno‘] = $anonymous;
      else
         $_SESSION[‚jmeno‘] = $_POST[‚form_jmeno‘];
      if (Empty($_POST[‚form_heslo‘]))
         $_SESSION[‚heslo‘] = $anon;
      else
         $_SESSION[‚heslo‘] = $_POST[‚form_heslo‘];
      $adresa = „ftp.php?“.SID;
      Header(„Location: $adresa“);
      exit;
   }
}

Naopak, pokud voláme stránku za účelem přihlášení k FTP serveru, pak provedeme kontrolu, zda byla zadána adresa FTP serveru a port pro připojení. Dále vyhodnotíme, zda bylo zadáno přihlašovací jméno a heslo. Pokud nebylo, použijeme údaje pro anonymní přihlášení. Spustíme session a uložíme přihlašovací údaje do session proměnných, takže je budeme mít k dispozici i v dalších skriptech. Nakonec provedeme přesměrování na stránku ftp.php. Konstanta SID se přidává za URL pro případ, že by webový prohlížeč měl vypnuté cookies. V takovém případě skript doplní do URL id session automaticky (tedy dle nastavení PHP).

require(„hlavicka.php“);
?>

Připojíme soubor s HTML hlavičkou.

<body>
<table width=“100%“ height=“100%“ cellspacing=“0″ cellpadding=“0″ border=“0″>
  <tr>
    <td align=“center“ valign=“middle“>
      <form action=“index.php“ method=“POST“>
      <table align=“center“ width=“300″ cellspacing=“1″ cellpadding=“1″ border=“0″>
<?
if (IsSet($_GET[‚zprava‘])) {
?>
        <tr class=“chyba“>
          <td colspan=“2″ align=“center“><b><? echo URLDecode($_GET[‚zprava‘]); ?></b></td>
        </tr>
<?
}
?>
        <tr class=“hlavicka“>
          <td colspan=“2″ align=“center“> <br><b><? echo $program; ?></b><br> </td>
        </tr>
        <tr class=“adr“>
          <td align=“right“>FTP server: </td>
          <td><input type=“text“ name=“form_ftpserver“ size=“20″></td>
        </tr>
        <tr class=“adr“>
          <td align=“right“>Port: </td>
          <td><input type=“text“ name=“form_port“ value=“21″ size=“4″></td>
        </tr>
        <tr class=“adr“>
          <td align=“right“>Jméno: </td>
          <td><input type=“text“ name=“form_jmeno“ size=“20″></td>
        </tr>
        <tr class=“adr“>
          <td align=“right“>Heslo: </td>
          <td><input type=“password“ name=“form_heslo“ size=“20″></td>
        </tr>
        <tr class=“adr“>
          <td colspan=“2″ align=“center“> <br><input type=“submit“ value=“Přihlásit“><br> </td>
        </tr>
      </table>
      </form>
    </td>
  </tr>
</table>
</body>
</html>

Pokud je nastavená proměnná zprava, vypíšeme její obsah. Zobrazíme formulář pro přihlášení. Formulář obsahuje pole pro zadání adresy FTP serveru (zadáváme ve tvaru ftp.nekde.cz nikoli ftp://ftp.nekde.cz) a portu (přednastaveno 21), dále přihlašovacího jména a hesla. Po odeslání stránka volá sama sebe a uživatel je buď přesměrován na stránku ftp.php nebo se zobrazí znovu přihlašovací formulář.

Soubor funkce.php

Soubor obsahuje definice uživatelských funkcí, které jsou skriptem využívány. Funkce ftp_rawlist, kterou používáme k získání obsahu adresáře a informací o podadresářích a souborech, vrací neformátovaný výstup ve tvaru:

-rw-r–r– 1 somebody somegrp 67859 Jan 20 12:15 soubor1.htm
-rw——- 1 somebody somegrp 67859 May 3 9:03 soubor2.htm
-rw——- 1 somebody somegrp 67859 Now 11 11:11 soubor3.htm
drwxr-xr-x 1 somebody somegrp 4609 Jan 29 5:45 adresar1
drwxrwxrwx 1 somebody somegrp 4609 Feb 7 10:37 adresar2

Musíme si proto pomocí regulárních výrazů z tohoto neformátovaného výstupu příslušné údaje vytáhnout, k čemuž slouží následujících pět funkcí.

<?
function JeToAdresar($polozka) {
   if (ereg(„^d[rstwx\-]{9}“, $polozka))
      return true;
   else
      return false;
}

Funkce JeToAdresar slouží k rozhodování, zda se jedná o adresář nebo o soubor. Podle jejího výsledku potom danou položku vypíšeme do seznamu adresářů nebo souborů. Pomocí funkce ereg porovnáme, zda platí regulární výraz ^d[rstwx\-]{9}, pro řetězec v proměnné polozka. O adresář se jedná, pokud je první písmeno rovno d. O regulárních výrazech pojednávají například články Regulární výrazy v PHP (1.) a Regulární výrazy v příkladech.

function ZjistiDatum($polozka) {
   $shody = array();
   eregi(„([a-z]{3} +[0-9]{1,2} [ 0-9\:]{4,5})“, $polozka, $shody);
   return $shody[1];
}

Funkce ZjistiDatum slouží k získání data vzniku souboru či adresáře. Opět pomocí regulárního výrazu vytáhneme příslušnou část a z pole shody si pak zjistíme hodnotu data, kterou funkce vrátí.

function ZjistiNazev($polozka) {
   $shody = array();
   eregi(„[a-z]{3} +[0-9]{1,2} [ 0-9\:]{4,5} (.+)$“, $polozka, $shody);
   return $shody[1];
}

Funkce ZjistiNazev slouží k získání názvu souboru či adresáře.

function ZjistiAtributy($polozka) {
   $shody = array();
   eregi(„^(.{10}) „, $polozka, $shody);
   return $shody[1];
}

Funkce ZjistiAtributy slouží k získání atributů souboru či adresáře.

function ZjistiVelikost($polozka) {
   $shody = array();
   eregi(„^.{10}[ ]+[0-9]+ [^ ]+ +[^ ]+ +([0-9]+) „, $polozka, $shody);
   return $shody[1];
}

Funkce ZjistiVelikost slouží k získání velikosti souboru či adresáře.

Příště dokončíme popis definovaných funkcí a také popis posledního souboru aplikace.

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

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

Štítky: Články

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 *