Comment travailler avec PHP et FTP

Dans ce tutoriel, notre objectif est de créer une classe FTP avec PHP bien écrite, utile et extensible..

Décrivant notre objectif

Il est toujours important de commencer par définir exactement les fonctionnalités que votre classe devrait inclure. Dans notre cas:

  • se connecter à un serveur
  • créer un dossier sur le serveur
  • télécharger un fichier
  • changer de répertoire
  • récupérer la liste du répertoire
  • télécharger un fichier

Quand utiliserais-je une classe FTP??

Il y a plusieurs cas où on peut utiliser ce type de classe. Quelques scénarios pourraient être:

  • Automatiser le téléchargement d'images, telles qu'une galerie, sur le site Web d'un client (idéalement, en conjonction avec mon redimensionnement d'image)
  • Effectuez des sauvegardes hors site en transférant un fichier de sauvegarde de base de données de votre serveur à un autre. (Remarque: ceci n'est pas recommandé pour les informations sensibles, car FTP n'est pas un protocole très sécurisé..)

Remarque: Il est facile de rencontrer des problèmes avec FTP en raison de différentes configurations de serveur. Ce code a été testé avec succès sur plusieurs serveurs FTP..


Qu'est ce que le FTP?

FTP: "Protocole standard utilisé pour copier un fichier d’un hôte à un autre."

Le protocole FTP, ou protocole de transfert de fichier, est, tel que défini par Wikipedia: "Protocole réseau standard utilisé pour copier un fichier d'un hôte à un autre sur un réseau basé sur TCP / IP, tel qu'Internet".

Essentiellement, il vous permet de copier un ou plusieurs fichiers d’un ordinateur à un autre..


Étape 1 - Préparation

Nous allons commencer aussi facile que possible. Dans la racine de votre nouveau projet, créez deux fichiers: index.php et ftp_class.php.

le index.php file est notre page principale qui crée l'objet et appelle les méthodes nécessaires. le ftp_class.php est juste cela: notre classe ftp.

Dans l'étape suivante, nous allons créer le squelette pour notre classe. Une fois que cela est en place, vous pourrez suivre et essayer chaque étape.


Étape 2 - Mise en place de la classe

La force de la programmation orientée objet (POO) est de donner au code complexe une interface facile à utiliser. En créant une classe (pensez à une classe comme un modèle), vous pouvez encapsuler les données, ce qui est simplement du jargon pour un terme faisant référence à la dissimulation des données. Nous pouvons ensuite réutiliser cette classe encore et encore sans avoir à réécrire le code. Au lieu de cela, il vous suffit d’appeler les méthodes appropriées (le terme "méthode" est le même que une fonction).

Commençons par créer notre classe ftp. Ouvrez votre ftp_class.php fichier et ajoutez le code suivant. Ceci est une structure de squelette de classe de base, que j'ai nommée 'FTPClient'.

le construction fonction, appelée constructeur, est une méthode de classe spéciale appelée automatiquement par la classe lorsque vous créez un nouvel objet ou une instance de la classe. C'est typiquement un bon endroit pour ajouter une initialisation; mais pour le but d'aujourd'hui, nous n'en avons pas besoin. Néanmoins, nous le garderons ici pour une utilisation future.

 Classe FTPClient // *** Variables de classe publique function __construct () 

Veuillez noter que nous utilisons un double souligner pour cela construction méthode.


Étape 3 - Variables de classe

Ensuite, nous allons définir certaines variables de classe, ou propriétés.

 private $ connectionId; private $ loginOk = false; private $ messageArray = array ();

Le "privé"préfixe définit la portée de la variable. Dans ce cas, cela signifie que la variable ne peut pas être accédée de n’importe où en dehors de la classe.

le $ connectionId variable stockera notre flux de connexion. Les deux autres stockent l’état et les éventuels messages. $ loginOk sera utile pour déterminer si nous sommes correctement connectés.


Étape 4 - Enregistrement de message simple

Dans presque toutes les méthodes, nous allons appeler une méthode, nommée 'logMessage. Ceci est un gestionnaire de messages très basique, qui nous permettra de capturer tous les messages créés par notre classe afin que nous puissions fournir à l'utilisateur des commentaires..

Notez que nous ne faisons pas revenir les messages réels de nos méthodes. Au lieu de cela, nous revenons vrai ou faux, en fonction de la réussite ou non d’une opération donnée. Cela a ses avantages, mais ne précise pas non plus à l'utilisateur ce qui se passe.

Ajoutez les deux méthodes suivantes afin que nous puissions déterminer ce qui réussit.

Cette méthode accepte une variable, $ message. Le contenu de cette variable est ensuite sauvegardé dans notre tableau de classe, grâce à la ligne: $ this-> messageArray [] = $ message;

 fonction privée logMessage ($ message) $ this-> messageArray [] = $ message; 

Parce que $ messageArray est une variable de classe, on peut y accéder via le $ this-> notation.

Dans une classe, $ this se réfère à l'objet lui-même.

Pour récupérer le message, nous appelons getMessages.

 fonction publique getMessages () return $ this-> messageArray; 

Cette méthode est une méthode publique. Comme mentionné précédemment, cette entreprise privée / publique se réfère simplement à la portée de la variable, ou dans ce cas, la méthode. Il est impossible d’accéder à une méthode privée (ou variable) en dehors de la classe, alors qu’une méthode publique (ou variable) peut être utilisée..

Comme notre variable est privée, nous avons besoin d’un moyen d’y accéder. Nous faisons cela en donnant à notre classe un Publique méthode, à laquelle nous pouvons ensuite accéder en dehors de la classe. Vous pourriez vous demander pourquoi nous ne pouvons pas simplement faire la messageArray public variable. Nous pouvons; cela dit, ce n'est tout simplement pas une bonne pratique.

Remarque: Il existe de nombreux exemples sur le Web de gestionnaires de messages complets ou de classes qui leur sont dédiées. Nous travaillons sur une implémentation simple pour les besoins de ce tutoriel..


Étape 5 - Connexion

Dans cette étape, nous ajouterons le relier méthode. Cela nous permettra de nous connecter à un serveur FTP.

 fonction publique connect ($ serveur, $ ftpUser, $ ftpPassword, $ isPassive = false) // *** Configurez la connexion de base $ this-> connectionId = ftp_connect ($ server); // *** Connexion avec nom d'utilisateur et mot de passe $ loginResult = ftp_login ($ this-> connectionId, $ ftpUser, $ ftpPassword); // *** Active / désactive le mode passif (désactivé par défaut) ftp_pasv ($ this-> connectionId, $ isPassive); // *** Vérifie la connexion si ((! $ This-> connectionId) || (! $ LoginResult)) $ this-> logMessage ('La connexion FTP a échoué!'); $ this-> logMessage ('Tentative de connexion à'. $ serveur. 'pour l'utilisateur'. $ ftpUser, true); retourne faux;  else $ this-> logMessage ('Connecté à'. $ serveur. ', pour l'utilisateur'. $ ftpUser); $ this-> loginOk = true; retourne vrai; 

Nous transmettons nos informations de connexion: le serveur ($ serveur), Nom d'utilisateur ($ ftpUser), et mot de passe ($ ftpPassword) pour nous permettre d’établir une connexion.

La première ligne de code ouvre une connexion FTP, avec ftp_connect, au serveur spécifié. Nous sauvons notre connexion à la variable de classe, $ connectionId décrit ci-dessus.

Le code, ftp_login nous connecte à la connexion spécifiée, en passant par notre identifiant de connexion, notre nom d'utilisateur et mot de passe.

Vous avez peut-être remarqué le ftp_pasv ligne de code. Ceci, comme le laisse supposer le commentaire, active / désactive le mode passif. Je vous conseillerais de ne pas l'activer. Toutefois, si vous rencontrez des problèmes de connexion, essayez de l'activer. Le mode passif peut causer des difficultés lors de la connexion via FTP.

Nous déterminons si la connexion a réussi. Nous enregistrons ensuite les résultats en appelant notre méthode de gestionnaire de messages simple., logMessage (), et passez la chaîne pour vous connecter. Rappelez-vous: nous utilisons $ this-> accéder logMessage (), comme c'est une variable de classe.


Étape 6 - Appel de l'objet

Maintenant que notre classe fonctionne, nous pouvons le tester! Ouvrez votre index.php fichier et ajoutez le code suivant.

Vous aurez besoin d'un accès à un serveur FTP pour pouvoir jouer. Si vous souhaitez configurer votre propre serveur, essayez Filezilla - c'est gratuit aussi.

Vous remarquerez que j'ai ajouté les détails du serveur FTP ici. Idéalement, ceux-ci seraient stockés dans votre config fichier. Modifiez-les pour qu'ils correspondent aux paramètres de votre serveur FTP..

Après avoir défini les détails de notre serveur FTP, nous incluons la classe avec include ('ftp_class.php');. Cela signifie: rendre la classe disponible à partir de cette page. La ligne suivante crée un objet de notre classe FTP et le stocke dans la variable, $ ftpObj. $ ftpObj sera maintenant utilisé pour accéder à toutes les méthodes publiques de notre classe. Ceci est fait en utilisant le -> notation, tout comme la ligne suivante en appelant le $ ftpObj -> connect méthode et en passant nos détails du serveur.

 // *** Définissez votre hôte, votre nom d'utilisateur et votre mot de passe define ('FTP_HOST', '192.168.1.88'); define ('FTP_USER', 'Blimpf'); define ('FTP_PASS', 'poisson-chat'); // *** Inclure la classe include ('ftp_class.php'); // *** Crée l'objet FTP $ ftpObj = new FTPClient (); // *** Connect $ ftpObj -> connect (FTP_HOST, FTP_USER, FTP_PASS);

Comme vous pouvez le constater, une fois que notre classe est en place, la connexion à notre serveur FTP est vraiment très simple.!


Étape 6b - Visualisation de la sortie

Dans la dernière étape, nous pourrions envelopper l’appel de connexion dans un si déclaration, comme démontré ci-dessous. Ensuite, si nous ne parvenons pas à nous connecter, le code dépendant ne sera pas exécuté. Nous pouvons ensuite envoyer tous les messages à l'utilisateur, tels que "connecté" ou "échoué".

 // *** Connecter si ($ ftpObj -> connecter (FTP_HOST, FTP_USER, FTP_PASS)) // *** Puis ajoutez le code FTP ici echo 'connected';  else echo 'Echec de la connexion'; 

Ce n'est pas grave, mais notre code va rapidement devenir encombré de déclarations IF / ELSE, si nous ajoutons cela à tous nos appels. Au lieu de cela, j'aimerais proposer une alternative qui rendra les choses un peu plus propres et plus faciles à suivre.

Rappelez-vous les méthodes de gestionnaire de message que nous avons ajoutées? Si vous souhaitez voir les messages produits par la classe - utiles pour le débogage / le retour d'informations - vous pouvez ajouter le code suivant après n'importe quelle méthode appelée..

 print_r ($ ftpObj -> getMessages ());

Cela affichera le message de la classe.


Étape 7 - Créer notre premier répertoire

Excellent, il est maintenant temps de faire quelque chose d'utile. La première méthode que nous allons créer est la makeDir méthode. Comme prévu, cette méthode créera des répertoires pour nous sur le serveur. Le seul paramètre que nous allons transmettre est le chemin du répertoire et le nom du dossier; nous l'appellerons répertoire $. La ligne magique ici est la ftp_mkdir fonction intégrée. Il utilise notre sauvé "ID connexion"et le passé dans répertoire $ variable pour créer le dossier.

Ajoutez le code suivant à votre ftp_class.php fichier:

 fonction publique makeDir ($ directory) // *** Si la création d'un répertoire a réussi? if (ftp_mkdir ($ this-> connectionId, $ directory)) $ this-> logMessage ('Répertoire "'. $ répertoire. '" créé avec succès'); retourne vrai;  autre  // ***? Sinon, échec. $ this-> logMessage ('Echec de la création du répertoire "'. $ directory. '"'); retourne faux; 

Et, pour l'appeler de votre index.php fichier, ajouter:

 $ dir = 'photos'; // *** Make directory $ ftpObj-> makeDir ($ dir);

La variable, $ dir est défini sur le nom du dossier que nous voulons créer sur le serveur. Dans ce cas: "photos".

La ligne suivante appelle la méthode qui créera le dossier.

Si vous recevez une erreur "Autorisation refusée", assurez-vous que vous pouvez écrire dans le dossier spécifié. Vous devrez peut-être créer le dossier dans un répertoire, tel que / httpdocs.


Étape 8 - Télécharger un fichier

En continuant, mettons en ligne une photo, appelée zoe.jpg. Lors du téléchargement d'un fichier, nous devons spécifier le type de fichier que nous mettons en ligne. - binaire ou Ascii? Fondamentalement, si vous téléchargez un fichier texte, nous devrions utiliser Ascii; sinon, il devrait être réglé sur binaire.

Nous commençons par mettre en place un tableau avec toutes les extensions que nous devrions utiliser pour un Ascii tapez upload.

 $ asciiArray = array ('txt', 'csv');

Ensuite, nous récupérons l’extension de notre fichier afin de pouvoir vérifier s’il s’agit de l’un des fichiers. Ascii les types. Nous déterminons cela en obtenant l'extension du fichier que nous mettons en ligne. La méthode rapide et sale que j'ai utilisée ici est
en "explosant" le fichier en utilisant le '.comme délimiteur. Cela divisera le fichier en morceaux et les stockera en tant que tableau. En utilisant une autre fonction PHP intégrée, "end", nous sélectionnons la dernière tableau élément qui contient notre extension. C'est un peu de code bien rangé.

 $ extension = end (explode ('.', $ fileFrom));

Ensuite, nous testons si notre extension apparaît dans la liste (avec in_array) des extensions de fichiers à charger en tant que type. Ascii. Si elle apparaît dans la liste, nous définissons la variable mode $ à FTP_ASCII; sinon, nous supposons qu'il est de type binaire et assignons mode $ la valeur FTP_BINARY.

 in_array ($ extension, $ asciiArray)

ftp_put télécharge un fichier de votre emplacement local vers un fichier distant sur le serveur FTP. Nous passons notre "ID connexion", le chemin du fichier que nous voulons télécharger ($ fileTo), le chemin
du fichier que nous voulons télécharger ($ fileFrom), et le mode (mode $) que nous venons de déterminer.

Ensuite, ajoutez la méthode suivante à votre ftp_class.php fichier:

 fonction publique uploadFile ($ fileFrom, $ fileTo) // *** Définit le mode de transfert $ asciiArray = array ('txt', 'csv'); $ extension = end (explode ('.', $ fileFrom)); if (in_array ($ extension, $ asciiArray)) $ mode = FTP_ASCII;  else $ mode = FTP_BINARY;  // *** Télécharger le fichier $ upload = ftp_put ($ this-> connectionId, $ fileTo, $ fileFrom, $ mode); // *** Vérifier l'état du téléchargement si (! $ Upload) $ this-> logMessage ('Le téléchargement FTP a échoué!'); retourne faux;  else $ this-> logMessage ('Uploaded "'. $ fileFrom. '" as "'. $ fileTo); return true;

Bien sûr, vous pouvez créer ou télécharger n'importe quel nom de dossier! Ajoutez ce prochain extrait de code à votre index.php déposer et ajuster en conséquence.

 $ fileFrom = 'zoe.jpg'; $ fileTo = $ dir. '/' $ fileFrom; // *** Télécharger le fichier local dans le nouveau répertoire sur le serveur $ ftpObj -> uploadFile ($ fileFrom, $ fileTo);

À présent, vous devriez être en mesure de comprendre à quel point cette classe est facile à utiliser! Nous ne faisons que des appels simples pour effectuer nos tâches - tout cela grâce à la programmation orientée objet!


Étape 9 - Affichage des fichiers

Vérifions maintenant que notre fichier est dans le photo dossier. Nous pouvons le faire en naviguant vers le 'photo'dossier sur notre serveur, puis affichez le contenu.

le changeDir méthode utilise "ftp_chdir"to change le répertoire courant sur le serveur ftp. Il suffit de passer dans le répertoire pour le changer. Simple et agréable.

ftp_class.php:

 fonction publique changeDir ($ directory) if (ftp_chdir ($ this-> connectionId, $ directory)) $ this-> logMessage ('Le répertoire actuel est maintenant:'. ftp_pwd ($ this-> connectionId)); retourne vrai;  else $ this-> logMessage ('Impossible de changer de répertoire'); retourne faux; 

getDirListing affichera le contenu du répertoire dans lequel vous vous trouvez en utilisant la fonction "ftp_nlist". Cette fonction renvoie la liste des fichiers d’un répertoire donné. Le répertoire actuel est défini par défaut, vous n’avez donc pas besoin de fournir de paramètres..

Si vous le souhaitez, vous pouvez le remplacer en passant le répertoire $ chemin que vous souhaitez voir le contenu de. le $ paramètres variable par défaut à '-la'. C'est une commande Linux pour afficher plus d'informations sur le répertoire. N'hésitez pas à l'enlever ou à passer une chaîne vide.

ftp_class.php:
 fonction publique getDirListing ($ directory = '.', $ parameters = '-la') // récupère le contenu du répertoire actuel $ contentsArray = ftp_nlist ($ this-> connectionId, $ parameters. ". $ directory); return $ contentsArray;

le getDirListing méthode retourne un tableau qui contient notre liste de répertoires.

index.php
 // *** Changer dans le dossier $ ftpObj-> changeDir ($ dir); // *** Récupérer le contenu du dossier $ contentsArray = $ ftpObj-> getDirListing (); // *** Affiche notre tableau de contenu de dossier echo '
'; print_r ($ contentsArray); écho '

';

Votre résultat devrait ressembler à ceci:


Étape 10 - Télécharger un fichier

Alors que nous nous rapprochons de la conclusion de ce tutoriel, nous allons ensuite télécharger le fichier. La méthode commence par le même code que téléverser un fichier, en ce sens qu'il détermine si le fichier que nous voulons télécharger est Ascii ou binaire.

Pour cette méthode, il vous suffit de passer le nom du fichier (et éventuellement le chemin, selon que vous vous trouvez dans le même dossier que le fichier à télécharger) du fichier à télécharger et le nom que vous souhaitez lui attribuer. votre machine client.

Pour télécharger un fichier, vous devez appeler ftp_get.

 ftp_get ($ this-> ID de connexion, $ fileTo, $ fileFrom, $ mode, 0)

Cela télécharge un fichier d'un serveur distant sur notre ordinateur local. Il accepte le paramètre suivant: notre identifiant de connexion, le chemin d’accès et le nom du fichier à enregistrer localement (sera écrasé s’il le permet.
existe déjà) ($ fileTo), l’emplacement et le nom du fichier sur le serveur distant ($ fileFrom), et le mode (mode $).

ftp_class.php
 fonction publique downloadFile ($ fileFrom, $ fileTo) // *** Définit le mode de transfert $ asciiArray = array ('txt', 'csv'); $ extension = end (explode ('.', $ fileFrom)); if (in_array ($ extension, $ asciiArray)) $ mode = FTP_ASCII;  else $ mode = FTP_BINARY;  // essayez de télécharger $ remote_file et de l'enregistrer dans $ handle if (ftp_get ($ this-> connectionId, $ fileTo, $ fileFrom, $ mode, 0)) return true; $ this-> logMessage ('fichier "'. $ fileTo. '" téléchargé avec succès');  else return false; $ this-> logMessage ("Une erreur s'est produite lors du téléchargement du fichier" ". $ fileFrom." "à" ". $ fileTo." "); 

Nous allons télécharger le même fichier que nous avons téléchargé en l'enregistrant sous un nom différent sur notre ordinateur client..

Remarque: Encore une fois, assurez-vous que vos autorisations sont définies correctement!

Parce que nous devrions maintenant être à l'intérieur de notre photo dossier, nous n’ajoutons pas de chemin au $ fileFrom variable - seul le nom du fichier.

index.php
 $ fileFrom = 'zoe.jpg'; # L'emplacement sur le serveur $ fileTo = 'zoe-new.jpg'; # Répertoire local à enregistrer dans // *** Télécharger le fichier $ ftpObj-> downloadFile ($ fileFrom, $ fileTo);

Étape 11 - Terminer

Pour compléter notre classe, ajoutons la méthode magie de classe, __déconstruire. Cette méthode ferme notre connexion lorsque la référence à notre objet n'existe plus - peut-être que la page a été fermée. En tout état de cause, ce code est exécuté et la connexion est fermée. C'est toujours une bonne pratique d'inclure ceci, bien que ce ne soit pas tout à fait nécessaire.

 fonction publique __deconstruct () if ($ this-> connectionId) ftp_close ($ this-> connectionId); 

Conclusion

Eh bien ça le fait! J'espère que vous comprenez mieux maintenant comment utiliser FTP avec PHP. Vous devriez maintenant avoir les compétences nécessaires pour développer davantage cette classe afin de prendre en charge d'autres tâches courantes, telles que renommer ou supprimer des fichiers et des dossiers..

Assurez-vous de nous informer si vous créez des clients FTP PHP intéressants!