YBET informatique

Rue Albert 1er, 7

6810 Pin - Chiny

Route Arlon - Florenville

(/fax: 061/32.00.15

Formations créations de site YBET en ligne

YBET informatique Forum webmaster Créer son site internet

25. Fonctions FTP et dossiers avec PHP

1. Base de connexion FTP. - 32. Commandes liées aux dossiers et répertoires de destination - 3. Commande dossiers et fichiers source.

Nous avons déjà utilisé le protocole de transfert FTP pour transférer nos fichiers de notre ordinateur (en local) vers le site internet avec un simple logiciel client FTP. Dans cette partie, nous allons lier FTP à PHP, pour transférer automatiquement un fichier d'un serveur internet (ou d'un site) vers un autre, éventuellement un site complet ou même un fichier texte MySQL à importer. Nous ne rentrerons pas trop dans toutes les commandes, juste permettre un transfert simple de données entre serveurs.

Un transfert nécessite que le serveur qui reçoit les fichiers soit configuré comme serveur FTP. Tous les serveurs sur Internet sont configurés pour cette fonction (à quelques rares exceptions, pour des ordinateurs hébergés en interne dans l'entreprise et reliés à Internet via un serveur démilitarisé DMZ. C'est loin d'être le plus courant. Par contre, EasyPhp ou Wampserver (en local) n'inclus pas ce type de serveur. La suite se fait donc directement sur un hébergement INTERNET.

Pour créer une connexion, vous devez connaître trois paramètres:

Dans la suite du cours (même s'ils ne fonctionnent pas), nous utiliserons ftp.ybet.be comme Host, YBET comme login et PS comme mot de passe. Ces paramètres sont fournis par votre hébergeur et doivent être insérés dans un fichier à part inclus dans un dossier protégé par HTACCESS.

1. Base de connexion FTP

Le mécanisme est équivalent à une connexion sur une base de donnée MySQL:

Mais forcément, les commandes seront différentes. La première chose est d'établir une liaison avec le serveur. Ceci se fait pas la commande PHP:

ftp_connect ( HOST [, numero port ], temps de connexion ])

HOST est le nom du serveur FTP, le numéro de port est le numéro utilisé pour se connecter. S'il est omis, c'est le 21 utilisé par défaut. Le temps de connexion est la durée de connexion avant la fermeture s'il n'y a pas de transfert. Il est exprimé en secondes (90 secondes par défaut).

<?php
$ftp_server = "ftp.ybet.be";

$connect = ftp_connect($ftp_server);
?>

Ensuite, connexion comme utilisateur en reprenant le nom utilisateur et le mot de passe

ftp_login($connect,login,mot de passe)
$connect est le paramètre récupéré de ftp_connect

Ceci donne pour la connexion en langage PHP:

$login="YBET";
$password="PS";
$login_result = ftp_login($connect, $login, $password);

La partie suivante va vérifier si la connexion est effective, cette méthode ci-dessous est la plus facile.

if (ftp_login($connect, $login, $password)) {
echo "Connecté en tant que $login sur $ftp_server<br>";
} else {
echo "Connexion impossible en tant que ".$login."<br>";
}

Une fois la communication établie, vous pouvez la fermer par la commande

ftp_close($connect)
$connect est le paramètre récupéré de ftp_connect

2. Commandes liées aux fichiers et répertoires.

Le but n'est pas trop de rentrer dans les détails, mais de voire les fonctions les plus utilisées pour les transferts FTP. Cette partie de reprend quasiment que le serveur de destination, pas votre serveur de départ (qui sera vu au chapitre 4).

2.1. Transfert d'un fichier.

Commençons par le plus simple, un transfert de fichier depuis un site vers un autre. La première opération est de télécharger le fichier ci-dessous dans le dossier source. Supposons que ce fichier s'appelle tests.php. Nous allons le transférer sur le site ybet.be

<?php
$ftp_server = "ftp.ybet.be";

$login="YBET";
$password="PS";
$connect = ftp_connect($ftp_server);
if (ftp_login($connect, $login, $password)) {
echo "Connecté en tant que $login sur $ftp_server<br>";
} else {
echo "Connexion impossible en tant que ".$login."<br>";
}
$destination_file="/www/tests.php";
$source_file="tests.php";
$upload = ftp_put($connect, "$destination_file", "$source_file", FTP_ASCII);
if (!$upload) {
echo "Le transfert Ftp a échoué!";
} else {
echo "Téléchargement de ". $source_file." sur ". $ftp_server." en ".$destination_file;
}
?>

La commande principale est FTP_PUT qui renvoit True en cas de succès et False en cas d'erreur. Dans notre cas, nous envoyons le fichier du dossier courant (où est téléchargé le programme) vers le dossier /www/tests.php. Ceci est lié à la structure des dossiers des serveurs Linux (mais peut être paramétré sur la console d'administration du serveur).

$upload = ftp_put($connect, "$destination_file", "$source_file", FTP)

FTP doit être renseigné, il prend la valeur FTP_BINARY ou FTP_ASCII.

La variable de retour permet de vérifier si le fichier a bien été téléchargé.

2.2. Créer un dossier

Nous pouvons également créer un dossier sur le serveur de destination. Remarquez de nouveau le /www/ spécifique à un serveur Linux mais paramétrable.

<?php
$directory="/www/directory";
$dossier=ftp_mkdir ($connect,$directory);
?>

2.3. Modifie le répertoire de destination courant.

Une fois le dossier créé (ou même avant de le créer, cas d'un sous-dossier), vous pouvez modifier le dossier courant de destination (pas celui depuis le quel vous transférez des fichiers).

<?php
$directory="/www/hardware";
$dossier=ftp_chdir ($connect,$directory);
?>

2.4. Dossier courant de destination.

La solution de transfert de fichier ci-dessus permet de transférer un fichier vers un autre serveur (ou dossier) mais le nom du fichier doit être connu.  En plus, vous ne savez pas où est ce dossier. Cette commande nécessite au préalable de modifier le répertoire courant, sinon elle ne renvoit rien.

<?php
$dossier=ftp_pwd($connect);
?>

2.5. Fichiers dans le dossier courant de destination.

Cette fonction renvoie une variable sous forme de tableau. Comme vu dans le cours sur les variables de type matrice du cours PHP-MySQL, pour récupérer le nombre de valeur  (fichiers et dossiers), nous pouvons utiliser  la fonction count($tableau) dans le cas d'une matrice à une entrée. Le script ci-dessus permet également via la boucle While d'afficher les fichiers et dossiers présents dans le répertoire de destination.

<?php
$tableau=ftp_nlist($connect,$repertoire);
$nombre=count($tableau);
echo "nombre: ".$nombre."<br>";
$i=0;
while ($i<21)
{
echo $tableau[$i]."<br>";
$i=$i+1;
}
?>

La commande FTP_RAWLIST() est identique mais renvoie également les informations sur le fichier sous forme de tableau.

2.6. Créer un dossier

$dir="directory";
$valeur=ftp_mkdir($connect, $dir));

Cette commande permet de créer un dossier dans le dossier courant en cours.

2.7. Suppression d'un dossier

$dir="directory";
$valeur=ftp_rmdir($connect, $dir));

2.8. Taille d'un fichier.

La fonction ftp_size ($connect,fichier) permet de récupérer la taille d'un fichier (en octet), mais elle peut aller plus loin puisque la taille d'un dossier est de 0 (en fait c'est -1 qui est renvoyé), permettant de dissocier les fichiers de dossiers. Jetons un oeil sur le programme ci-dessous.

$directory="/www/hardware";
$dossier=ftp_chdir ($connect,$directory);

$dossier=ftp_pwd($connect);
echo "dossier courant ".$dossier;
$tableau=ftp_nlist($connect,$repertoire);
$nombre=count($tableau);
echo "nombre: ".$nombre."<br>";
$i=0;
while ($i<$nombre)
{
echo $tableau[$i]." - ".ftp_size ($connect,$tableau[$i])."<br>";
$i=$i+1;
}

La première partie va positionner le curseur dans le dossier /www/hardware/ (commande FTP_CHDIR) et l'afficher via FTP_PWD.

La partie suivante va récupérer les fichiers dans ce dossier via FTP_NLIST, afficher le nombre puis dans la boucle While afficher le nom et la taille associée. Ceux qui ont une taille de -1 sont automatiquement des répertoires.

2.9. Suppression d'un fichier.

Pour supprimer un fichier sur le dossier distant (de destination),

$file="tests.php";
$valeur=FTP_DELETE ($connect,$file);

La variable $valeur est booléenne, false si la commande a échouée, True si elle a réussit.

2.10. CHMOD

Dernière commande de cette liste (il y en a d'autres), celle qui permet de modifier les propriétés CHMOD d'un fichier.

$fichier="tests.php";
$int=0644;
// la valeur est constituée de 4 chiffres en octal (de 0 à 7).
$valeur=FTP_CHMOD($connect,$int,$fichier);

3. Commande du dossier source.

Nous avons vu les commandes permettant de gérer la partie destination. Il nous faut également gérer les dossiers et fichiers de départs (source). Ces commandes ne sont pas liées à FTP, mais bien à PHP et à Apache.

3.1. Le dossier courant.

La première question est de connaître le dossier courant du pointeur. Au départ, c'est celui où s'exécute le programme PHP, mais il sera modifié par la suite par une autre fonction.

echo getcwd();

// par exemple /home/ybet/www. Remarquez que c'est un dossier de type Linux, pas de l'hébergement, home étant le dossier reprenant les dossiers utilisateurs, ybet, le nom utilisateur. En pratique, ça ne gênera pas trop.

3.2. Changer le dossier courant.

Une fois le dossier courant connu (par défaut, celui où s'exécute le programme PHP), vous pouvez modifier le dossier courant pour copier des fichiers par exemple.

CHDIR ('directory');
// descend dans le sous-dossier directory
CHDIR ('..');
// remonte au niveau de la root
CHDIR('../');
// remonte d'un niveau de dossier.
CHDIR('directory/include');
// descend dans le sous-dossier directory, puis include.

3.3. Ouverture, lecture et fermeture d'un dossier.

Pour lire le contenu d'un dossier, vous devez d'abord ouvrir le dossier avec la fonction opendir('dossier'). OPENDIR('.') ouvre le dossier courant.

La partie lecture utilise la fonction readdir() qui reprend les fichiers 1 à 1. Elle nécessite donc une boucle pour lire le contenu complet d'un répertoire.

En dernier, vous devez fermer le dossier par la commande closedir().

$dir = opendir('.');
while (false !== ($file = readdir($dir))) {
echo $file."<br>";
}
closedir($handle);

// cette fonction affiche le contenu du dossier en cours, fichiers et sous-dossiers.

Une nouvelle fonction avec PHP5 permet directement d'afficher le contenu. Elle renvoie une variable sous forme de tableau.

$tableau=scandir ("dossier");
// par ordre alphabétique croissant
$tableau=scandir ("dossier",1);
// par ordre alphabétique décroissant

3.4. Créer ou supprimer un dossier

Deux commandes permettent de créer ou de supprimer un dossier. De nouveaux, elles renvoient une commande booléenne pour le résultat de la fonction.

bool=mkdir('répertoire'[,CHMOD]) permet de créer un sous-dossier. Le code CHMOD peut également être inséré automatiquement.

RMDIR('répertoire') permet de supprimer un sous-dossier.

Par exemple, créons le dossier verif dans le dossier courant

if (!mkdir ('verif'))
{
echo 'erreur';
}else
{
echo "réussi";
}
// la partie suivante positionne le curseur dans le dossier verif.
CHDIR ('verif');
echo getcwd();

3.5. Fichier ou dossier?

Deux commandes permettent finalement de déterminer si c'est un fichier ou un dossier. Elles renvoient de nouveau une variable booléenne.

$variable=is_dir ('dossier' )
// renvoie true si le fichier existe et si c'est un dossier, faux sinon
$variable=is_file ('fichier' )
// renvoie true si le fichier existe et si c'est bien un fichier (pas un dossier), faux sinon

3.6. Est-ce que le fichier existe?

$variable=file-exist ('fichier' )
// renvoie true si le fichier existe et faux (false) sinon

3.7. Supprimer un fichier en PHP

Deux options sont possibles, la commande unlink() et la fonction delete (qui renvoie en fait vers la première). Elle n'efface pas un dossier, réservé à RMDIR() vue plus haut.

$variable=unlink ('fichier' );
// renvoie true si le fichier existe et faux (false) sinon

3.8. Copier un fichier

Cette commande utilise COPY. Le fichier de destination est écrasé s'il existe déjà. De nouveau, le résultat est une valeur booléenne indiquant si le transfert a réussi. Il n'y a pas de caractères de remplacement.

$variable=copy('source','destination')
// ou
if (!copy('tests.php','tests.sav'))
{
echo "raté";
} else
{
echo "La copie s'est bien passée";
}

3.9. Déplacer ou renommer un fichier

La commande MOVE n'existe pas en PHP, c'est la commande rename qui permet de donner un nouveau nom au fichier ou de le déplacer.

if (!rename('tests.php','tests.sav'))
{echo "raté";
}else
{
echo "réussi";
}
// déplacer dans un sous-dossier par exemple (ici verif) et renommer le fichier.
if (!rename('tests.php','verif/tests.sav'))
{echo "raté";
}else
{
echo "réussi";
}

3.10 Contenu d'un fichier.

Via la commande FILE, vous pouvez lire et afficher le contenu d'un fichier (où plutôt le résultat HTML, pas les lignes de commandes en PHP). Elle permet via des commandes d'ouverture et de modification du contenu de fichier de modifier le contenu. Nous ne verrons que celle-ci.

<?php
// Lit une page web dans un tableau.
$lines = file ('http://www.ybet.be/');
// Affiche toutes les lignes du fichier en code HTML, avec numéro de ligne
foreach ($lines as $line_num => $line)
{
echo 'Ligne: ' . $line_num . ' : ' . htmlspecialchars($line) . '<br />'."\n";
}
?>

3.11. Pour terminer.

Voici pour les principales. Les autres commandes ne sont pas vues ici, notamment les commandes qui permettent d'ouvrir un fichier pour ajouter du contenu. Pour la liste des commandes de dossiers, fichiers, vous pouvez vérifier directement dans les manuels en ligne. Les commandes permettant de télécharger un fichier avec un dossier ont déjà été vues dans la partie téléchargement image.

4. Quelques exemples pratiques

4.1. Déplacé tous les fichier d'un dossier vers un sous-dossier sur votre serveur.

Nous ouvrons d'abord le dossier en cours, récupérons les fichiers dans une boucle et les transférons vers le sous-dossier verif (en fait un fichier appelé 'verif/'.$file. Les dossiers ne sont pas copiés mais bien affichés. Vous pouvez utiliser la fonction is_dir() pour éventuellement ne pas les afficher dans la boucle (ou pour tous autres traitements).

$dir = opendir('.');
while (false !== ($file = readdir($dir))) {
echo $file."<br>";
$file1="verif/".$file;
copy ($file,$file1);
}
closedir($handle);

4.2. Déplacer tous les fichiers d'un dossier source vers un dossier à créer sur un autre serveur.

Nous allons mélanger les fonctions source et FTP (destination) pour cette partie. Le programme ci-dessous ne déplace pas les sous-dossiers, juste les fichiers.

La première chose est de créer la connexion FTP sur le serveur de destination et de créer le répertoire. Dans notre cas, nous allons utiliser 

$ftp_server = "ftp.ybet.be";
$login="YBET";
$password="PS";
$connect = ftp_connect($ftp_server);
if (ftp_login($connect, $login, $password)) {
echo "Connecté en tant que $login sur $ftp_server<br>";
} else {
echo "Connexion impossible en tant que ".$login."<br>";
}
// fin de connexion FTP, ouvert par défaut pendant 90 secondes
// Créer le dossier directory et déplacer le pointeur vers le dossier créé.

$directory="/www/directory";
$dossier=ftp_mkdir ($connect,$directory);
$dossier=ftp_chdir ($connect,$directory);
// récupération des fichiers sur le dossier source (en cours) comme ci-dessus et les envoyer vers le dossier de destination.

// lorsque le fichier source est un dossier, il n'est pas créé en destination et le transfert échoue

while (false !== ($file = readdir($dir))) {
// début transfert
$destination_file=$file;
$source_file=$file;
$upload = ftp_put($connect,$destination_file,$source_file, FTP_ASCII);
if (!$upload) {
echo "Le transfert Ftp a échoué!<br>";
} else {
echo $file." Téléchargement de ". $source_file." sur ". $ftp_server." en ".$destination_file."<br>";
}
// fin transfert
}
closedir($handle);
// on ferme la connexion FTP.

Une fois encore, la difficultée est de positionner (ou du moins de connaître) le dossier en cours de départ et de destination sur le serveur Apache.

>26. Chiffrement et déchiffrement de mot de passe en PHP
< 24. Les Cookies

Mis en ligne 24/02/2008.