begin process at 2012 05 27 22:15:09
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseau & Internet

 > CLASSE D'INTERFACE SFTP

CLASSE D'INTERFACE SFTP


 Information sur la source

Note :
Aucune note
Catégorie :Réseau & Internet Classé sous :PHP, SFTP, FICHIER VOLUMINEUX Niveau :Initié Date de création :14/06/2010 Date de mise à jour :14/06/2010 20:24:08 Vu / téléchargé :3 084 / 98

Auteur : ithurts

Ecrire un message privé
Commentaire sur cette source (0)
Ajouter un commentaire et/ou une note

 Description

Une class user friendly calibré pour les besoins de mon stage permettant principalement de récupérer et déposer de très gros fichier par SFTP ne permettant pas l'utilisation de ssh2_exec.
Les fonctions ci dessous sont beaucoup plus rapide que ssh_scp_rcv/send et surtout, non bloquante en cas d'erreur.
La classe est documentée pour doxygen.
Beaucoup de ce code à été inspiré par les "User Contributed Notes" de php.net.
Débutant, je suis ouvert à toutes vos remarques sur ce code, en particulier la gestion des erreurs ou les commentaires !
Merci d'avance pour vos contributions !

La bibliothèque ssh2 doit être installé sur le serveur pour utiliser cette classe : http://fr2.php.net/manual/fr/ssh2.setup.php.


Source

  • <?php
  • function debug($msg, $var = 'debug')
  • {
  • if (isset($_GET[$var]))
  • {
  • echo trim($msg), "\n";
  • ob_flush();
  • flush();
  • }
  • }
  • if (!function_exists("ssh2_connect")) die("La bibliotheque ssh2 n'est pas disponible sur le serveur, pour l'installer visitez par exemple <a href=\"http://naeh.net/installer-libssh2-ssh2-pour-php/\">http://naeh.net/installer-libssh2-ssh2-pour-php</a>/\n");
  • /** @class sftp
  • * @brief interface sftp
  • *
  • */
  • class sftp
  • {
  • private $id = false, $server = false, $url = false;
  • /** @brief Constructeur
  • *
  • * Tente d'etablir une connexion SFTP à un serveur distant.
  • * @param $server
  • * ip/host du server
  • * @param $user
  • * Identifiant de la connexion
  • * @param $pass
  • * Mot de passe
  • * @throw
  • * Une exception remontera en cas d'erreur
  • */
  • public function __construct ($server, $user, $pass)
  • {
  • debug("Tentative de connexion au serveur SSH " . $server);
  • $this->id = ssh2_connect($server, 22);
  • if(!$this->id || empty($this->id))
  • throw new Exception ('Échec de connexion à ' . $server);
  • debug("Tentative d'authentification");
  • if (!ssh2_auth_password($this->id, $user, $pass))
  • throw new Exception ("Échec d'identification à " . $server);
  • $this->url = ssh2_sftp($this->id);
  • if (!$this->url)
  • throw new Exception ("Echec d'ouverture du SFTP sur le serveur " . $server);
  • debug("SFTP ouvert");
  • $this->server = $server;
  • }
  • /** @brief Destructeur
  • *
  • * Ferme une connection sftp
  • */
  • public function __destruct()
  • {
  • debug("Fermeture de la connexion SSH\n");
  • ssh2_exec($this->id, "exit");
  • }
  • /** @brief Retourne la taille d'un fichier sur le serveur distant
  • * @param $file
  • * chemin absolu du fichier
  • * @return
  • * taille du fichier en octet
  • */
  • private function getfilesize($file)
  • {
  • return filesize("ssh2.sftp://" . $this->url . $file);
  • }
  • /** @brief Recupere un fichier sur le serveur distant
  • *
  • * Tente de recuperer un fichier sur le serveur distant,
  • * user friendly , $name n'a pas besoin d'être le chemin absolu vers le fichier
  • * par exemple get("foo/zomg/lol.csv") va recuperer le fichier /../foo/zomg/lol.csv sur le serveur
  • * dans le fichier lol.csv du dossier courant local
  • * @param $name
  • * nom du fichier à récuperer sur le serveur
  • * @param $local_name
  • * facultatif, nom du fichier en local après transfert
  • * @return
  • * Renvois le chemin du fichier recupéré en local
  • * @throw
  • * Une exception remontera en cas d'erreur
  • */
  • public function get($name, $local_name = false)
  • {
  • try {$name = $this->fpath($name);}
  • catch (Exception $e) {throw $e;}
  • if (!$local_name)
  • $local_name = '.' . (strpos(name, '/') === false?strrchr($name, '/'):('/' . $name));
  • debug("Tentative de transfert du fichier '" .$local_name ."' depuis le serveur '" .$name . "'");
  • $handle = @fopen("ssh2.sftp://" . $this->url . $name, 'r');
  • if (!$handle)
  • throw new Exception ("Impossible d'ouvrir le fichier " . $name . " sur le serveur distant " . $this->server);
  • $size = $this->getfilesize($name);
  • $contents = '';
  • $transfered = 0;$i = 0;
  • while ($transfered < $size && ($buffer = fread($handle, $size - $transfered)))
  • {
  • debug($transfered, " transfere sur ", $size);
  • $transfered += strlen($buffer);
  • $contents .= $buffer;
  • if ($i++ > 1000)
  • {
  • fclose($handle);
  • throw new Exception ('Erreur pendant le transfert du fichier ' . $name . 'depuis le serveur' . $this->server . ' : timeout');
  • }
  • }
  • file_put_contents ($local_name, $contents);
  • fclose($handle);
  • debug("\nTransfert du fichier '" . $name . "' depuis le serveur " . $this->server . " reussi");
  • return ($local_name);
  • }
  • /** @brief Dépose un fichier sur le serveur distant
  • *
  • * Tente de déposer un fichier sur le serveur distant,
  • * user friendly , $name n'a pas besoin d'être le chemin absolu vers le fichier
  • * par exemple put("foo/zomg/lol.csv") va deposer le fichier lol.csv du dossier courant dans le dossier /../foo/zomg/lol.csv du serveur
  • * @param $name
  • * nom du fichier à déposer sur le serveur
  • * @param $local_name
  • * facultatif, nom du fichier
  • * @throw
  • * Une exception remontera en cas d'erreur
  • */
  • public function put($name, $remote_name = false)
  • {
  • try
  • {
  • if (!$remote_name)
  • {
  • $remote_name = $this->fpath($name);
  • $name = '.' . (strpos($name, '/') === false ?('/' . $name):strrchr($name, '/'));
  • }
  • else
  • $remote_name = $this->path(substr($remote_name, 0 , strrpos($remote_name, '/'))) . strrchr($remote_name, '/');
  • }
  • catch (Exception $e) {throw $e;}
  • debug("Tentative de transfert du fichier '" . $name . "' sur le serveur " . $this->server);
  • $handle = fopen("ssh2.sftp://" . $this->url . $remote_name, 'w');
  • if (!$handle)
  • throw new Exception('Impossible d\'ouvrir le fichier ' . $remote_name . ' en ecriture sur le serveur ' . $this->server);
  • $data = file_get_contents(strpos($name, "/")?'.' . strrchr($name, "/"):$name);
  • if ($data === false)
  • throw new Exception("Impossible d'ouvrir le fichier local " . $name);
  • $transfered = fwrite($handle, $data);
  • if ($transfered === false)
  • throw new Exception("Impossible de transferer le fichier " . $name);
  • $size = strlen($data);
  • if ($transfered != $size)
  • {
  • while ($transfered < $size && ($transfered += fwrite($handle, mb_substr($data, $transfered, $size - $transfered))))
  • debug($transfered . " transfere sur " . $size);
  • }
  • debug("Fichier " . $remote_name . " correctement depose");
  • fclose($handle);
  • }
  • /** @brief Deplace un fichier sur le serveur distant
  • *
  • * Tente de deplacer un fichier sur le serveur distant
  • * user friendly , les chemins n'ont pas besoin d'être absolu
  • * par exemple mv("foo/zomg/lol.csv", "omfg/lolz.txt") va deplacer /../foo/zomg/lol.csv vers /../omfg/lolz.txt
  • * @param $old
  • * nom du fichier à déplacer
  • * @param $new
  • * nouveau nom & chemin
  • * @throw
  • * Une exception remontera en cas d'erreur
  • */
  • public function mv($old, $new)
  • {
  • try
  • {
  • $old = $this->fpath($old);
  • $new = $this->fpath($new);
  • }
  • catch (Exception $e)
  • {
  • throw $e;
  • }
  • debug('Tentative de deplacement du fichier \'' . $old . '\' vers \'' . $new . "'");
  • $old_handle = fopen("ssh2.sftp://" . $this->url .$old, 'r');
  • if (!$old_handle)
  • throw new Exception ("Impossible d'ouvrir en lecture le fichier '" . $old . "' sur le serveur distant");
  • $new_handle = fopen("ssh2.sftp://" . $this->url .$new, 'w');
  • if (!$new_handle)
  • throw new Exception ("Impossible d'ouvrir en ecriture le fichier '" . $new . "' sur le serveur distant");
  • $size = $this->getfilesize($old);
  • $read = 0;
  • $wrote = 0;
  • while ($read < $size && ($buffer = fread($old_handle, $size - $read)))
  • {
  • $tmp_size = strlen($buffer);
  • $read += $tmp_size;
  • $tmp_wrote = 0;
  • while ($tmp_wrote <$tmp_size)
  • {
  • $tmp = fwrite($new_handle, substr($buffer, $tmp_wrote));
  • if (!$tmp)
  • break;
  • $tmp_wrote += $tmp;
  • }
  • $wrote += $tmp_size;
  • }
  • debug("taille du fichier = " . $size . " , " . $read . " octets lu, " . $wrote . " octets ecrit");
  • fclose($new_handle);
  • fclose($old_handle);
  • if ($size == $read && $read == $wrote)
  • unlink("ssh2.sftp://" . $this->url . $old);
  • else
  • throw new Exception ("Erreur pendant le deplacement du fichier " . $old . " en " . $old . "\ntaille du fichier = " . $size . " , " . $read . " octets lu, " . $wrote . " octets ecrit\n");
  • }
  • /** @brief Récupere le chemin absolu d'un dossier
  • *
  • * @param $dir
  • * nom du dossier
  • * @return
  • * chemin absolu du dossier $dir sur le serveur distant
  • */
  • private function path($dir)
  • {
  • $rlpath = @ssh2_sftp_realpath($this->url, $dir);
  • if (!$rlpath)
  • throw new Exception ("Dossier introuvable sur le serveur distant : " . $dir);
  • return $rlpath;
  • }
  • /** @brief Récupere le chemin absolu d'un fichier sur le serveur
  • *
  • * @param $name
  • * nom du fichier
  • * @return
  • * chemin absolu du fichier sur le serveur
  • */
  • private function fpath($name)
  • {
  • try
  • {
  • if (strpos($name, '/') === false)
  • $name = $this->path('.') . '/' . $name;
  • else
  • $name = $this->path(substr($name, 0 , strrpos($name, '/'))) . strrchr($name, '/');
  • }
  • catch (Exception $e)
  • {
  • throw $e;
  • }
  • return $name;
  • }
  • /** @brief Liste le contenu d'un dossier
  • *
  • * Liste le contenu d'un dossier passé en parametre ou le dossier courant si aucun dossié donné.
  • * Ne renvois pas les dossiers
  • * Offre la possibilitée de filtrer les resultats possedant l'extension "$ext" et la chaîne de caractere $like dans leur noms
  • * @param $directory
  • * nom du dossier
  • * @param $like
  • * pattern à respeceter
  • * @param $ext
  • * extension des fichiers à respecter
  • * @return
  • * renvois la liste des fichiers sous la forme d'un tableau non associatif
  • * @throw
  • * une exception remontera en cas d'erreur
  • */
  • public function flist($directory = './' , $like = false, $ext = false)
  • {
  • $dir = $this->path($directory);
  • $handle = opendir("ssh2.sftp://" . $this->url . $dir);
  • if (!$handle)
  • throw new Exception ("Impossible d'ouvrir le dossier " . $directory . " sur le serveur " . $this->server);
  • $files = array();
  • while (false !== ($file = readdir($handle)))
  • {
  • if (substr($file, 0, 1) != "." && !is_dir($file))
  • {
  • if ($like && $ext)
  • {
  • if (stripos($file, $like) !== false && strrchr($file , ".") == (strpos($ext, ".") !== false?$ext:(".".$ext)))
  • $files[] = $dir . '/' . $file;
  • }
  • else
  • $files[] = $dir . '/' . $file;
  • }
  • }
  • sort($files);
  • return $files;
  • }
  • /** @brief Recupere une liste de fichier
  • *
  • * Recupere une liste de fichier et les deplace (sur le serveur distant) ds le dossier $dir_if_success si spécifié
  • * @param $files_ar
  • * tableau de fichiers
  • * @param $like
  • * pattern à respeceter
  • * @param $ext
  • * extension des fichiers à respecter
  • * @return
  • * renvois la liste des fichiers sous la forme d'un tableau non associatif
  • * @throw
  • * une exception remontera en cas d'erreur
  • */
  • public function get_files($files_ar, $dir_if_success = false)
  • {
  • $error = count($files_ar);
  • $files = array();
  • foreach ($files_ar as $k =>$v)
  • {
  • debug("Transfert de $v.");
  • try
  • {
  • $files[$k] = $this->get($v);
  • if ($dir_if_success)
  • $this->mv($v, $dir_if_success . strrchr($files[$k], "/"));
  • debug("Transfert reussi");
  • }
  • catch (Exception $e)
  • {
  • debug("Echec dans le transfer du fichier $v :\n" . $e->getMessage());;
  • $error--;
  • }
  • }
  • if (!$error)
  • throw new Exception ("Impossible de récuperer les fichiers spécifié, vérifiez les droit, le type de transfert ou type de connexion");
  • if (empty($files))
  • return false;
  • sort($files);
  • return $files;
  • }
  • }
  • /* Exemple d'utilisation : */
  • try
  • {
  • $_GET['debug'] = true;
  • $sftp = new sftp(SERVER, USER, PASS);
  • $files = $sftp->flist("data/");
  • print_r($files);
  • $sftp->get_files($files, "data/treated/");
  • }
  • catch (Exception $e)
  • {
  • die ($e->getMessage()."\n");
  • }
<?php
function debug($msg, $var = 'debug')
	{
		if (isset($_GET[$var]))
		{
			echo  trim($msg), "\n";
			ob_flush();
			flush();
		}
	}
if (!function_exists("ssh2_connect")) die("La bibliotheque ssh2 n'est pas disponible sur le serveur, pour l'installer visitez par exemple <a href=\"http://naeh.net/installer-libssh2-ssh2-pour-php/\">http://naeh.net/installer-libssh2-ssh2-pour-php</a>/\n");
/** @class sftp
*	@brief interface sftp
*
*/
class sftp
{
	private $id = false, $server = false, $url = false;	
	
	/** @brief Constructeur
	*
	* Tente d'etablir une connexion SFTP à un serveur distant.
	* @param	$server
	*	ip/host du server
	* @param 	$user
	*	Identifiant de la connexion
	* @param	$pass
	*	Mot de passe
	* @throw
	*	Une exception remontera en cas d'erreur
	*/
	public function __construct ($server, $user, $pass)
	{
		debug("Tentative de connexion au serveur SSH " . $server);
		$this->id = ssh2_connect($server, 22);
		if(!$this->id || empty($this->id))
			throw new Exception ('Échec de connexion à ' . $server);
		debug("Tentative d'authentification");
		if (!ssh2_auth_password($this->id, $user, $pass))		
			throw new Exception ("Échec d'identification à " . $server);
		$this->url = ssh2_sftp($this->id);
		if (!$this->url)
			throw new Exception ("Echec d'ouverture du SFTP sur le serveur " . $server);
		debug("SFTP ouvert");							
		$this->server = $server;
	}

	/** @brief Destructeur
	*
	* Ferme une connection sftp
	*/
	public function __destruct()
	{
		debug("Fermeture de la connexion SSH\n");
		ssh2_exec($this->id, "exit");			
	}		

	/** @brief Retourne la taille d'un fichier sur le serveur distant
	* @param	$file
	*	chemin absolu du fichier
	* @return
	*	taille du fichier en octet
	*/
	private function getfilesize($file)
	{
		return filesize("ssh2.sftp://" . $this->url . $file);
    }	
	
	/** @brief Recupere un fichier sur le serveur distant
	*
	* Tente de recuperer un fichier sur le serveur distant, 
	* user friendly , $name  n'a pas besoin d'être le chemin absolu vers le fichier
	* par exemple get("foo/zomg/lol.csv") va recuperer le fichier /../foo/zomg/lol.csv sur le serveur 
	* dans le fichier lol.csv du dossier courant local
	* @param	$name 
	*	nom du fichier à récuperer sur le serveur
	* @param 	$local_name
	*	facultatif, nom du fichier en local après transfert
	* @return
	*	Renvois le chemin du fichier recupéré en local
	* @throw
	*	Une exception remontera en cas d'erreur
	*/
	public function get($name, $local_name = false)
	{
		try {$name = $this->fpath($name);}
		catch (Exception $e) {throw $e;}
		if (!$local_name)
			$local_name = '.' . (strpos(name, '/') === false?strrchr($name, '/'):('/' . $name));			
		debug("Tentative de transfert du fichier '" .$local_name ."' depuis le serveur '" .$name . "'");
		$handle = @fopen("ssh2.sftp://" . $this->url . $name, 'r');
		if (!$handle)
			throw new Exception ("Impossible d'ouvrir le fichier " . $name . " sur le serveur distant " . $this->server);			
		$size = $this->getfilesize($name);
		$contents = '';
		$transfered = 0;$i = 0;
		while ($transfered < $size && ($buffer = fread($handle, $size - $transfered)))
		{
			debug($transfered, " transfere sur ", $size);
			$transfered += strlen($buffer);
			$contents .= $buffer;
			if ($i++ > 1000)
				{
					fclose($handle);
					throw new Exception ('Erreur pendant le transfert du fichier ' . $name . 'depuis le serveur' . $this->server . ' : timeout');
				}
		}       
		file_put_contents ($local_name, $contents);
		fclose($handle);
		debug("\nTransfert du fichier '" . $name . "' depuis le serveur " . $this->server . " reussi");
		return ($local_name);
	}
	
	/** @brief Dépose un fichier sur le serveur distant
	*
	* Tente de déposer un fichier sur le serveur distant, 
	* user friendly , $name n'a pas besoin d'être le chemin absolu vers le fichier
	* par exemple put("foo/zomg/lol.csv") va deposer le fichier lol.csv du dossier courant dans le dossier /../foo/zomg/lol.csv du serveur
	* @param	$name 
	*	nom du fichier à déposer sur le serveur
	* @param 	$local_name
	*	facultatif, nom du fichier 
	* @throw
	*	Une exception remontera en cas d'erreur
	*/
	public function put($name, $remote_name = false)	
	{
		try
		{
			if (!$remote_name)
			{
				$remote_name = $this->fpath($name);						
				$name = '.' . (strpos($name, '/') === false ?('/' . $name):strrchr($name, '/'));
			}
			else
				$remote_name = $this->path(substr($remote_name, 0 , strrpos($remote_name, '/'))) . strrchr($remote_name, '/');																								
		}
		catch (Exception $e) {throw $e;}
		debug("Tentative de transfert du fichier '" . $name . "' sur le serveur " . $this->server);
		$handle = fopen("ssh2.sftp://" . $this->url . $remote_name, 'w');
		if (!$handle)
			throw new Exception('Impossible d\'ouvrir le fichier ' . $remote_name . ' en ecriture sur le serveur ' . $this->server);
		$data = file_get_contents(strpos($name, "/")?'.' . strrchr($name, "/"):$name);
		if ($data === false)
			throw new Exception("Impossible d'ouvrir le fichier local " . $name);
		$transfered = fwrite($handle, $data);
		if ($transfered === false)
			throw new Exception("Impossible de transferer le fichier " . $name);
		$size = strlen($data);
		if ($transfered != $size)
		{
			while ($transfered < $size && ($transfered += fwrite($handle, mb_substr($data, $transfered, $size - $transfered))))
				debug($transfered . " transfere sur " . $size);
		}
		debug("Fichier " . $remote_name . " correctement depose");
		fclose($handle);
	}
	
	
	/** @brief Deplace un fichier sur le serveur distant
	*
	* Tente de deplacer un fichier sur le serveur distant
	* user friendly , les chemins n'ont pas besoin d'être absolu
	* par exemple mv("foo/zomg/lol.csv", "omfg/lolz.txt") va deplacer /../foo/zomg/lol.csv vers /../omfg/lolz.txt
	* @param	$old
	*	nom du fichier à déplacer
	* @param 	$new
	*	nouveau nom & chemin
	* @throw
	*	Une exception remontera en cas d'erreur
	*/
	public function mv($old, $new)
	{
		try
		{
			$old = $this->fpath($old);
			$new = $this->fpath($new);
		}
		catch (Exception $e)
		{
			throw $e;
		}
		debug('Tentative de deplacement du fichier \'' . $old . '\' vers \'' . $new . "'");
		$old_handle = fopen("ssh2.sftp://" . $this->url .$old, 'r');
		if (!$old_handle)
			throw new Exception ("Impossible d'ouvrir en lecture le fichier  '" . $old . "' sur le serveur distant");
		$new_handle = fopen("ssh2.sftp://" . $this->url .$new, 'w');
		if (!$new_handle)
			throw new Exception ("Impossible d'ouvrir en ecriture le fichier  '" . $new . "' sur le serveur distant");
		$size = $this->getfilesize($old);
		$read = 0;
		$wrote = 0;
		while ($read < $size && ($buffer = fread($old_handle, $size - $read)))
		{
			$tmp_size = strlen($buffer);
			$read += $tmp_size;
			$tmp_wrote = 0;
			while ($tmp_wrote <$tmp_size)
			{
				$tmp = fwrite($new_handle, substr($buffer, $tmp_wrote));				
				if (!$tmp)
					break;
				$tmp_wrote += $tmp;
			}
			$wrote += $tmp_size;
		}
		debug("taille du fichier = " . $size . " , " . $read . " octets lu, " . $wrote . " octets ecrit");		
		fclose($new_handle);
		fclose($old_handle);
		if ($size == $read && $read == $wrote)
			unlink("ssh2.sftp://" . $this->url . $old);
		else
			throw new Exception ("Erreur pendant le deplacement du fichier " . $old . " en " . $old . "\ntaille du fichier = " . $size . " , " . $read . " octets lu, " . $wrote . " octets ecrit\n");		
	}
	
	/** @brief Récupere le chemin absolu d'un dossier
	*
	* @param	$dir
	*	nom du dossier
	* @return
	*	chemin absolu du dossier $dir sur le serveur distant
	*/
	private function path($dir)
	{
		$rlpath = @ssh2_sftp_realpath($this->url, $dir);
		if (!$rlpath)
			throw new Exception ("Dossier introuvable sur le serveur distant : "  . $dir);
		return $rlpath;
	}

	/** @brief Récupere le chemin absolu d'un fichier sur le serveur
	*
	* @param	$name
	*	nom du fichier
	* @return
	*	chemin absolu du fichier sur le serveur
	*/	
	private function fpath($name)
	{
		try 
		{
			if (strpos($name, '/') === false)
				$name = $this->path('.') . '/' . $name;
			else
				$name = $this->path(substr($name, 0 , strrpos($name, '/'))) . strrchr($name, '/');
		}
		catch (Exception $e)
		{
			throw $e;
		}
		return $name;
	}
	
	/** @brief Liste le contenu d'un dossier
	*
	* Liste le contenu d'un dossier passé en parametre ou le dossier courant si aucun dossié donné.
	* Ne renvois pas les dossiers
	* Offre la possibilitée de filtrer les resultats possedant l'extension "$ext" et la chaîne de caractere $like dans leur noms
	* @param	$directory
	*	nom du dossier
	* @param	$like
	*	pattern à respeceter
	* @param	$ext
	*	extension des fichiers à respecter
	* @return
	*	renvois la liste des fichiers sous la forme d'un tableau non associatif
	* @throw
	*	une exception remontera en cas d'erreur
	*/
	public function flist($directory = './' , $like = false, $ext = false)
	{
		$dir = $this->path($directory);
		$handle = opendir("ssh2.sftp://" . $this->url . $dir);
		if (!$handle)
			throw new Exception ("Impossible d'ouvrir le dossier " .  $directory . " sur le serveur " . $this->server);
		$files = array();
		while (false !== ($file = readdir($handle))) 
		{
			if (substr($file, 0, 1) != "." && !is_dir($file))
			{
				if ($like && $ext)
				{
					if (stripos($file, $like) !== false && strrchr($file , ".") == (strpos($ext, ".") !== false?$ext:(".".$ext)))
						$files[] = $dir . '/' . $file;
				}
				else
					$files[] =  $dir . '/' . $file;
			}
		}
		sort($files);
		return $files;		
	}

	/** @brief Recupere une liste de fichier
	*
	* Recupere une liste de fichier et les deplace (sur le serveur distant) ds le dossier $dir_if_success si spécifié
	* @param	$files_ar 
	*	tableau de fichiers
	* @param	$like
	*	pattern à respeceter
	* @param	$ext
	*	extension des fichiers à respecter
	* @return
	*	renvois la liste des fichiers sous la forme d'un tableau non associatif
	* @throw
	*	une exception remontera en cas d'erreur
	*/
	public function get_files($files_ar, $dir_if_success = false)
	{
		$error = count($files_ar);
		$files = array();
		foreach ($files_ar as $k =>$v)
		{
			debug("Transfert de $v.");
			try
			{
				$files[$k] = $this->get($v);
				if ($dir_if_success)
					$this->mv($v, $dir_if_success . strrchr($files[$k], "/"));
				debug("Transfert reussi");
			}
			catch (Exception $e)
			{
				debug("Echec dans le transfer du fichier $v :\n" . $e->getMessage());;
				$error--;
			}
		}
		if (!$error)
			throw new Exception ("Impossible de récuperer les fichiers spécifié, vérifiez les droit, le type de transfert ou type de connexion");
		if (empty($files))
			return false;
		sort($files);
		return $files;
	}
}
/* Exemple d'utilisation : */
try
{
        $_GET['debug'] = true;
	$sftp = new sftp(SERVER, USER, PASS);	
	$files = $sftp->flist("data/");
	print_r($files);
	$sftp->get_files($files, "data/treated/");
}
catch (Exception $e)
{
	die ($e->getMessage()."\n");	
}

 Conclusion

A terme j'aimerais me passer des file_get_contents et file_put_contents forçant à augmenter drastiquement la mémoire alloué dans php.ini.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

14 juin 2010 19:54:30 :
Ajout d'un zip.
14 juin 2010 20:24:08 :
Rajout d'une conclusion :)

 Sources de la même categorie

INSPECTEUR DE PAGES (VÉRIFIEZ SI DES SITES AFFICHENT UN TEXT... par pablo836
Source avec Zip Source avec une capture GÉOLOCALISATION par pgl10
Source avec Zip TAPI : METTRE EN RELATION DEUX POSTES TELEPHONIQUES par ravery
Source avec Zip CLIENT / SERVEUR : LES SOCKETS par Morphinof
Source avec Zip VALIDATEUR_3WC par lezj

 Sources en rapport avec celle ci

AFFICHÉ SUR UN TABLEAU AVEC PAGINATION ET BASE DE DONNÉES par stormxp
Source avec Zip POO - FORMULAIRE NEWSLETTER PHP - PROFESSEUR-PHP.COM par mtrix000
REDIMENSIONNEMENT D'IMAGE PHP par JStevens
Source avec Zip COLLECTION.CLASS.MIN.PHP par thunderhunter
EXEMPLE D'APPLICATION DE L'ALGORITHME DE DIJKSTRA EN PHP par philtr8

Commentaires et avis

Aucun commentaire pour le moment.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Comment tester les fichiers PHP [ par Clem ] Comment tester les fichiers PHP sans les publier sur son site ? Dans le genre de PWS avec l'asp PWS version PHP ! [ par Clem ] J'ai trouvé un PWS en mieux, et pour le PHP !Sur http://www.easyphp.org/, il suffit de télécharger la dernière version (8Mo) et de l'installer.L'avant comment faire avec pws [ par arnaud ] voila je veux me mettre au PHP je sais que je peux faire fonctionner PWS comme server pour PHP mais je trouve rien Alors pour ceux qui sont te,nte ai Developpeur PHP rechercher. [ par Trafalio BlackHammer ] Bonjour, je recherche un bon developpeur PHP, MySQL. Veuillez me contacter a trafalio@godsoft.orgMerci statistiques ,graphique, php et mysql [ par mouss ] connaissez vous des exemples mettant en oeuvre une base de donnée mysql ,php permettant de créer des courbes, nuages de points sur une feuille html (p Extensions de PHP [ par zerg ] je sais que l'on peut ajouter des extensions en php, ses propres extensions ou celle telechargeables mais difficiles a trouver.... ==&gt; ces extensio Mail et recup [ par H@lloWin___HiA ] SalutJe sais envoyé un mail avec un script PHP sur un serveurMais peut on envoyer un mail depuis un script qui serait ds localhost (easy php)Le proble Comment fait t-on pour executer des pages php [ par Arnaud ] merci Urgent svp !!! [ par Clem ] Comment récupérer le nom d'un fichier a partir de son adresse internet ?(Par exemple obtenir le nom dex.php a partir de http://localhost/dex.php) Démarrage sous PHP. [ par SurfSilver ] Salut à tous.JE me suis m'y cette semaine à Php dans l'espoir de concevoir une appli en base de donnée. Cet avec interet que j'essaierai de donner mes


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,515 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales