Gestion ftp (classe)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 006 fois - Téléchargée 18 fois

Contenu du snippet

Cette classe permet de :
- se connecter à un serveur FTP (SSL ou non)
- afficher un listing complet ou non d'un répertoire
- créer un répertoire
- supprimer un répertoire
- changer de répertoire
- remonter d'un niveau
- renommer un fichier ou un dossier
- supprimer un fichier
- afficher la taille d'un fichier
- changer les droits d'accès à un fichier / dossier
- uploader un fichier
- récupérer un fichier

Un exemple est en conclusion ;)

Source / Exemple :


<?php
/**

  • FTP
  • Gestion FTP
*
  • @author ShevAbam
  • @version 1.0 - 02 dec 2010
  • /
class FTP { private $_host; private $_user; private $_password; private $_port; private $_timeout; private $_ssl; private $_conn; /**
  • Constructeur
  • /
public function __construct($host, $user = 'anonymous', $pass = '', $port = 21, $timeout = 90, $ssl = false) { $this->setHost($host); $this->setUser($user); $this->setPassword($pass); $this->setPort($port); $this->setTimeout($timeout); $this->setSsl($ssl); $this->_connection(); $this->_login(); return $this; } /**
  • Retourne le serveur
  • /
public function getHost() { return $this->_host; } /**
  • Définit le serveur
  • /
public function setHost($new) { if (trim(!empty($new))) $this->_host = $new; return $this; } /**
  • Retourne l'utilisateur
  • /
public function getUser() { return $this->_user; } /**
  • Définit l'utilisateur
  • /
public function setUser($new) { if (trim(!empty($new))) $this->_user = $new; return $this; } /**
  • Retourne le mot de passe
  • /
public function getPassword() { return $this->_password; } /**
  • Définit le mot de passe
  • /
public function setPassword($new) { $this->_password = $new; return $this; } /**
  • Retourne le port
  • /
public function getPort() { return $this->_port; } /**
  • Définit le port
  • /
public function setPort($new) { if (trim(!empty($new))) $this->_port = $new; return $this; } /**
  • Retourne le timeout
  • /
public function getTimeout() { return $this->_timeout; } /**
  • Définit le timeout
  • /
public function setTimeout($new) { if (trim(!empty($new)) && is_numeric($new)) $this->_timeout = $new; return $this; } /**
  • Retourne la valeur du mode SSL
  • /
public function getSsl() { return $this->_ssl; } /**
  • Définit le mode SSL
  • /
public function setSsl($new) { if (trim(!empty($new)) && is_bool($new)) $this->_ssl = $new; return $this; } /**
  • Connexion en SSL ou non
  • /
private function _connection() { if ($this->_ssl == true) { $this->_conn = ftp_ssl_connect($this->_host, $this->_port, $this->_timeout); } elseif ($this->_ssl == true || $this->_conn == false) { $this->_conn = ftp_connect($this->_host, $this->_port, $this->_timeout); } } /**
  • Identification
  • /
private function _login() { if ($this->_conn != false) ftp_login($this->_conn, $this->_user, $this->_password); } /**
  • Active le mode passif
  • /
public function enablePassive() { if ($this->_conn != false) { ftp_pasv($this->_conn, true); } return $this; } /**
  • Ferme la connexion
  • /
public function close() { if ($this->_conn != false) return ftp_close($this->_conn); } /**
  • Alias de close()
  • /
public function quit() { $this->close(); } /**
  • Liste le contenu d'un dossier avec les détails ou non
  • /
public function ls($dir = '.', $full = false) { if ($this->_conn != false) { if ($full === false) { $content = ftp_nlist($this->_conn, $dir); // On supprime les dossiers "." et ".." unset($content[0], $content[1]); } else { $content = ftp_rawlist($this->_conn, $dir); } return $content; } } /**
  • Retourne le nom du dossier courant
  • /
public function pwd() { if ($this->_conn != false) return ftp_pwd($this->_conn); } /**
  • Création d'un répertoire
  • /
public function mkdir($dir = '') { if ($this->_conn != false) { if (trim(!empty($dir))) { if (!ftp_mkdir($this->_conn, $dir)) throw new Exception('FTP :: Impossible de créer le répertoire "'.$dir.'" (existant ou erreur)'); } } return $this; } /**
  • Suppression d'un répertoire
  • /
public function rmdir($dir = '') { if ($this->_conn != false) { if (trim(!empty($dir))) { if (!ftp_rmdir($this->_conn, $dir)) throw new Exception('FTP :: Impossible de supprimer le répertoire "'.$dir.'" (inexistant ou erreur)'); } } return $this; } /**
  • Changement de répertoire
  • /
public function cd($dir = '') { if ($this->_conn != false) { if (trim(!empty($dir))) { if (!ftp_chdir($this->_conn, $dir)) throw new Exception('FTP :: Impossible de changer de répertoire ("'.$dir.'")'); } } return $this; } /**
  • Remonte au dossier parent
  • /
public function cdup() { if ($this->_conn != false) { if (!ftp_cdup($this->_conn)) throw new Exception('FTP :: Impossible de changer de répertoire ("'.$dir.'")'); } return $this; } /**
  • Renomme un fichier ou un dossier
  • /
public function rename($oldname, $newname) { if ($this->_conn != false) { if (trim(!empty($oldname)) && trim(!empty($newname))) { if (!ftp_rename($this->_conn, $oldname, $newname)) throw new Exception('FTP :: Impossible de renommer "'.$oldname.'" en "'.$newname.'" (inexistant ou erreur)'); } } return $this; } /**
  • Supprime un fichier
  • /
public function del($file = '') { if ($this->_conn != false) { if (trim(!empty($file))) { if (!ftp_delete($this->_conn, $file)) throw new Exception('FTP :: Impossible de supprimer le fichier "'.$file.'" (inexistant ou erreur)'); } } return $this; } /**
  • Retourne la taille d'un fichier en octet
  • /
public function size($file = '') { if ($this->_conn != false) { if (trim(!empty($file))) { $size = ftp_size($this->_conn, $file); if ($size == -1) throw new Exception('FTP :: Impossible de récupérer la taille du fichier "'.$file.'" (inexistant ou erreur)'); else return $size; } } } /**
  • Modifie les droits d'un fichier ou d'un dossier
  • /
public function chmod($file, $mode) { if ($this->_conn != false) { if (trim(!empty($file)) && trim(!empty($mode))) { $mode = str_pad($mode, 4, '0', STR_PAD_LEFT); if (!ftp_chmod($this->_conn, $mode, $file)) throw new Exception('FTP :: Impossible de modifier les droits du fichier/dossier "'.$file.'"'); } } return $this; } /**
  • Upload un fichier
  • /
public function put($local, $remote, $mode = FTP_BINARY) { if ($this->_conn != false) { if (trim(!empty($local)) && trim(!empty($remote))) { if (!ftp_put($this->_conn, $remote, $local, $mode)) throw new Exception('FTP :: Impossible d\'uploader le fichier "'.$local.'"'); } } return $this; } /**
  • Récupère un fichier
  • /
public function get($remote, $local, $mode = FTP_BINARY) { if ($this->_conn != false) { if (trim(!empty($local)) && trim(!empty($remote))) { if (!ftp_get($this->_conn, $local, $remote, $mode)) throw new Exception('FTP :: Impossible de récupérer le fichier "'.$local.'"'); } } return $this; } } ?>

Conclusion :


/* E X E M P L E -----------------------------------------------*/

/**
Cet exemple se connecte à un serveur FTP et effectue les
étapes suivantes :
- activation du mode passif
- création d'un répertoire
- upload d'un fichier
- affichage du listing d'un répertoire
- suppression du fichier uploadé
- suppression du répertoire créé
- fermeture de la connexion

Bien sûr, vous pouvez effectuer d'autres manipulations
avec cette classe !
  • /


$oFTP = new FTP('monServeur', 'utilisateur', 'motdepasse');
$oFTP
->enablePassive()
->mkdir('mon_repertoire')
->put('monImage.png', 'mon_repertoire/monImage.png');

echo '<pre>';
print_r($oFTP->ls('mon_repertoire', true));
echo '</pre>';

$oFTP
->del('mon_repertoire/monImage.png')
->rmdir('mon_repertoire')
->close();

/*---------------------------------------------------------------- */

A voir également

Ajouter un commentaire

Commentaires

DiGhan
Messages postés
239
Date d'inscription
samedi 21 février 2004
Statut
Membre
Dernière intervention
3 juin 2010
1
Je rejoins le commentaire de genetAPT152 (pas très simple ton pseudo).

J'irai même plus loin en supprimant tous les tests "trim(!empty($new))" puisque dans tous les cas la connexion va échouer. C'est une vérification qui doit se faire en amont.

L'utilisation des exceptions est primordiale dans ta classe puisqu'il y a des "evenements" critiques (comme le statut de la connexion). Actuellement, le développeur n'a aucun retour mais surtout aucun message pour l'avertir. De plus comme l'a dit "genet...", les méthodes get() , put() ne doivent plus s'exécuter si la connexion a échoué.

Même si elles ne sont pas standardisées, tu respectes les conventions zend (plutôt bien pensées) et le code est propre.
genetApt151
Messages postés
30
Date d'inscription
lundi 7 mai 2007
Statut
Membre
Dernière intervention
2 avril 2011
1
Salut,

C'est vrai qu'en objet, c'est plus agréable à utiliser, mais j'ai remarqué quelques problèmes

1- Tester la validité d'une variable dans un setter est bonne chose mais il y a des erreurs.
Tout d'abord faire un if (trim(!empty($new))) n'a aucun sens, faire un trim sur un booléan ??si tu veux tester que la variable en entrée n'est pas vide il faut utilisé : if(!trim($new)) ou if(trim($new) null) ou if(trim($x) ''). Ensuite pour tester un entier (ex avec : setTimeout())
utiliser is_numeric suffit, pas besoin de tester que la variable est vide.

2- Utiliser des exceptions est une bonne pratique mais il faut alors crée une classe d'exception spécifique à ta classe au lieu du type générique Exception. Tu peux aussi utiliser les exceptions définie par la SPL. Il faut également spécifier un code d'erreur quand tu lèves une exception.

3- si tu utilises les exceptions pour gérer les erreurs, il faut le faire jusqu'au bout,
par exemple qu'est ce qui se passe si la connexion échoue et $this->_conn = false ?? Il n’y a aucune erreur et toutes les fonctions tel pwd, mkdir … tourne dans le vide puise que tu fais if ($this->_conn != false). Test si la connexion a réussi dans la méthode _connection() et renvoie une exception si la elle a échouée et enlève tous ces if ($this->_conn != false) inutiles.

4- Le nom de ta classe : FTP est trop commun et risque d'entrainer des confits, soit tu lui donnes a nom plus sophistiquée ou tu utilises les namespaces.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.