PHP - MySQL [Retour au menu]

FTP

FTP (File Transfer Protocol) est le protocole utilisé pour gérer les fichiers sur un serveur dans son ensemble. L'une des utilisations les plus fréquentes de FTP est l'envoi et la récupération de fichiers HTML sur le serveur de votre hébergeur. Par exemple, Dreamweaver est pourvu d'un programme FTP inclus qui permet d'envoser vos créations vers le serveur qui vous héberge. Depuis votre navigateur Internet (Internet Explorer par exemple), dans la barre d'adresse, à la place d'écrire http://www.unsiteinternetquelconque.com, vous tapez ftp://www.unsiteinternetquelconque.com, vous obtiendrez la liste des fichiers de ce site sur votre écran, comme si vous étiez sur votre propre ordinateur... Pour autant que le site "unsiteinternetquelconque" ne l'ait pas interdit évidemment...

Pour uploader des fichiers (par exemple une photo) depuis le PC local jusque sur le serveur Web, ce n'est pas FTP, mais HTTP, comme c'est expliqué ici.

Des utilisations de commandes FTP sont très pratiques avec PHP pour accéder aux fichiers de votre propre site. Par exemple, il est possible de trouver le nombre de fichiers d'un dossier. Tiens, excellente idée : faisons ça

A la base

Il s'agit tout d'abord d'établir une connexion FTP avec votre serveur (votre hébergeur) :
($Connexion est une bête variable)

<HTML>
<HEAD></HEAD>
<BODY>
  <?
    // Ouverture de la connexion :
    $Connexion = ftp_connect("www.votresiteweb.com");
    // Fermeture de la connexion :
    ftp_close($Connexion);
  ?>
</BODY>
</HTML>

Une fois connecté, il s'agit de fournir votre login et mot de passe (Les mêmes que vous utilisez pour uploader vos pages web vers votre hébergeur) :

$Connexion = ftp_connect("www.votresiteweb.com");
ftp_login($Connexion, "VotreLogin", "VotreMotDePasse");
ftp_close($Connexion);

Si vous vous trompez avec votre login et/ou votre mot de passe, le message d'erreur sera le même :

Warning: ftp_login(): Login incorrect. in /truc/machin/bidule/web/chose/pagetest.php on line XX

Récupération de la liste des fichiers

Si vous avez réussi à vous connecter (c'est à dire si vous n'avez aucune erreur lors de l'étape précédente), on va pouvoir commencer à s'amuser !

Combien de fichiers y a-t-il dans mon dossier ?

Nous avons la possibilité de récupérer la liste complète des fichiers du dossier courant dans un tableau grâce à ftp_nlist :

$Connexion = ftp_connect("www.votresiteweb.com");
ftp_login($Connexion, "VotreLogin", "VotreMotDePasse");
$ListeFichier = ftp_nlist($Connexion);
echo sizeof($ListeFichier);

ftp_close($Connexion);

Cet exemple donne simplement le nombre (sizeof) de fichiers dans le dossier courant.

Et quels sont leur nom ?

On peut accéder directement aux éléments du tableau (les noms des fichiers, donc:

$ListeFichier = ftp_nlist($Connexion);
echo $ListeFichier[0];
echo $ListeFichier[1];
echo $ListeFichier[2];

Mais comme on ignore combien ils sont, parcourons ce tableau avec foreach :

$Connexion = ftp_connect("www.votresiteweb.com");
ftp_login($Connexion, "VotreLogin", "VotreMotDePasse");
$ListeFichier = ftp_nlist($Connexion);
echo sizeof($ListeFichier);

foreach($ListeFichier as $Ctr)
  {
  echo "$Ctr <br>";
  }

ftp_close($Connexion);

Accès à un sous-dossier

Pour accéder à un sous-dossier du site, c'est simple, il suffit de rajouter le chemin du sous dossier dans ftp_nlist, comme ceci :

$Connexion = ftp_connect("www.votresiteweb.com");
ftp_login($Connexion, "VotreLogin", "VotreMotDePasse");

$ListeFichier = ftp_nlist($Connexion, "chambre/armoire/tiroir");
echo sizeof($ListeFichier);
foreach($ListeFichier as $Ctr)
  {
  echo "$Ctr <br>";
  }
ftp_close($Connexion);

La liste renvoyée va contenir le chemin complet des fichiers avec les fichiers eux-mêmes, comme ceci :

chambre/armoire/tiroir/truc.php
chambre/armoire/tiroir/machin.jpg
chambre/armoire/tiroir/bidule.htm
...

Pour extraire uniquement les noms des fichiers et non pas le chemin complet, nous allons utiliser les fonctions de chaîne de caractères :

- strrpos qui va trouver la dernière occurrence du signe "/"
- substr qui va extraire la fin de la chaîne à partir de la dernière occurrence de "/"

Par exemple :

                     111111111122
           0123456789012345678901
$Chaine = "truc/machin/gnagna.php";
echo strrpos($Chaine , "/");

va renvoyer 11 (en comptant à partir de 0)

echo substr($Chaine, 11);
ou
echo substr($Chaine, strrpos($Chaine , "/"));

renverraient toute la fin de la chaîne :

/gnagna.php

Il s'agit donc d'ajouter 1 à strrpos($Chaine , "/")

Voici le résultat final et propre : listing de tous les fichiers d'un sous-dossier SANS le chemin complet :

// création de la connexion
$Connexion = ftp_connect("www.votresite.com");
$Login = "votrelogin";
$MotDePasse = "votremotdepasse";
ftp_login($Connexion, $Login, $MotDePasse);

// récupération de la liste des fichiers
$ListeFichier = ftp_nlist($Connexion, "machin/truc/texte");
echo "Voici les ".sizeof($ListeFichier)." fichiers :";
echo "<BR>";
foreach($ListeFichier as $Fichier)
  {
  $Position = strrpos($Fichier , "/");
  echo substr($Fichier, $Position + 1);

  echo "<BR>";
  }

ftp_close($Connexion);

La même liste, triée alphabétiquement

Utilisation de sort :

...
$ListeFichier = ftp_nlist($Connexion, "armoire/tiroir");
sort($ListeFichier);
echo sizeof($ListeFichier);
...

Seulement un seul type de fichiers

Si je voulais ne voir que les fichiers .JPG, il me suffirait de préciser :

$ListeFichier = ftp_nlist($Connexion, "armoire/tiroir/*.jpg");

Voici la version finale : La liste de tous les fichiers qui commencent par la lettre a, de type jpg en ordre alphabétique, du dossier www.votresite.com/armoire/tiroir :

<?
  $Connexion = ftp_connect("www.votresite.com");
  ftp_login($Connexion, "votrelogin", "votremotdepasse");

  $ListeFichier = ftp_nlist($Connexion, "armoire/tiroir/a*.jpg");
  sort($ListeFichier);
  echo "Il y a en tout ".sizeof($ListeFichier)." fichiers dans ce dossier.";
  echo "<BR>";
  foreach($ListeFichier as $Fichier)
    {
    $Position = strrpos($Fichier , "/");
    echo substr($Fichier, $Position + 1);
    echo "<BR>";
    }
  ftp_close($Connexion);
?>

---