Voilà une classe permettant la gestion d'un serveur FTP (envoyer, supprimer, télécharger des fichiers etc ...)
Je pense que la source est suffisamment commentée mais si vous avez des questions n'hésitez pas !
Source / Exemple :
<?php
###########
#Class FTP#
###########
/*
########################################
# Exemple d'utilisation : #
#<?php #
#require 'FTP.class.php'; #
#$ftp = new FTP($host,$user,$password);#
#try { #
#$ftp->connect(); #
# // Utilisation des méthodes #
# } #
#catch (FTPException $e) { #
# echo $e; #
#} #
#?> #
########################################*/
class FTP {
/*
*
private $_stream;
/*
*
private $_user;
/*
*
private $pwd;
/*
*
private $_host;
/*
*
private $_port = 21;
/*
*
private $_timeout = 90;
/*
*
private $_passive = false;
/*
*
private $_ssl = false;
/*
- System type of FTP server
*
public $system_type;
/**
- Initialize connection params
*
- @param string $host
- @param string $user
- @param string $password
- @param int $port
- @param int $timeout (seconds)
- /
public function __construct($host = null, $user = null, $password = null, $port = 21, $timeout = 90) {
$this->_host = $host;
$this->_user = $user;
$this->_pwd = $password;
$this->_port = (int)$port;
$this->_timeout = (int)$timeout;
}
// Auto-close connection
public function __destruct(){
$this->close();
}
/* Set connection params :
- @param int $port
- @param int $timeout
- @param bool $passive
- @param bool $ssl
- /
public function setParams($port =21, $timeout=90, $passive=false, $ssl=false) {
$this->_port = (int)$port;
$this->_timeout = (int)$timeout;
$this->_passive = (bool)$passive;
$this->_ssl = $ssl;
}
/*
Close FTP connection
public function close() {
// check for valid FTP stream
if($this->_stream) {
ftp_close($this->_stream);
$this->_stream = false;
}
}
/* Change current folder
@param string $directory
public function chdir($directory) {
if(ftp_chdir($this->_stream, $directory)) {
}
else {
throw new FTPException("Failed to change name of directory to $directory");
}
}
/* Set file permissions
@param int $permission (ex: 0644)
@param string $file
public function chmod($permission = 0, $file = null) {
if(ftp_chmod($this->_stream, $permission, $file)) {
}
else {
throw new FTPException("Failed to set file permissions for $file");
}
}
/* Connect to FTP server
public function connect() {
if(!$this->_ssl) {
if(!$this->_stream = ftp_connect($this->_host, $this->_port, $this->_timeout)) {
throw new FTPException("Failed to connect to {$this->_host}");
}
} elseif(function_exists("ftp_ssl_connect")) {
if(!$this->_stream = ftp_ssl_connect($this->_host, $this->_port, $this->_timeout)) {
throw new FTPException("Failed to connect to {$this->_host} (SSL connection)");
}
} else {
throw new FTPException("Failed to connect to {$this->_host} (invalid connection type)");
}
if(ftp_login($this->_stream, $this->_user, $this->_pwd)) {
ftp_pasv($this->_stream, (bool)$this->_passive);
$this->system_type = ftp_systype($this->_stream);
} else {
throw new FTPException("Failed to connect to {$this->_host} (login failed)");
}
}
/* Delete a file on server
@param string $file
public function delete ($file = null) {
if(ftp_delete($this->_stream, $file)) {
}
else {
throw new FTPException("Failed to delete file $file");
}
}
/**
- Download file from server
*
- @param string $remote_file
- @param string $local_file
- @param int $mode
- /
public function get($remote_file, $local_file, $mode = FTP_ASCII) {
if(ftp_get($this->_stream, $local_file, $remote_file, $mode)) {
} else {
throw new FTPException("Failed to get file $remote_file");
}
}
/* Get date of last change of a file
@param string $file
@return string
public function mdtm($file) {
return ftp_mdtm($this->_stream, $file);
}
/* Create folder on server
@param string $directory
public function mkdir($directory) {
if(ftp_mkdir($this->_stream, $directory)) {
} else {
throw new FTPException("Failed to create directory $directory on this server.");
}
}
/* Get list of file/folder of a folder
@param string $directory
@return array
public function nlist($directory) {
$list = array();
if($list = ftp_nlist($this->_stream, $directory)) {
return $list;
} else {
throw new FTPException("Failed to get the file list of $directory");
}
}
/* Send a file on server
@param string $local_file
@param string $remote_file
public function put($local_file, $remote_file) {
if(ftp_put($this->_stream, $remote_file, $local_file, FTP_ASCII)) {
} else {
throw new FTPException("Failed to upload file $local_file");
}
}
/* Get current folder's name
@return string
public function pwd() {
return ftp_pwd($this->_stream);
}
/* Get a detailed list of file/folder of a folder
@param string $directory
@return array
public function rawlist($directory) {
$list = array();
if($list = ftp_rawlist($this->_stream, $directory)) {
return $list;
} else {
throw new FTPException("Failed to get the file list of $directory");
}
}
/* Rename a file
@param string $oldname
@param string $newname
public function rename($oldname, $newname) {
if(ftp_rename($this->_stream, $oldname, $newname)) {
} else {
throw new FTPException("Failed to rename file $oldname");
}
}
/* Delete a folder
@param string $sirectory
public function rmdir($directory) {
if(ftp_rmdir($this->_stream, $directory)) {
} else {
throw new FTPException("Failed to delete directory $directory");
}
}
/* Get file's size
@param string $file
@return int
public function size($file) {
return ftp_size($this->_stream, $file);
}
}
###################################################################
#Class FTPException & Interface IException & Class CustomException#
###################################################################
interface IException
{
/* Protected methods inherited from Exception class */
public function getMessage(); // Exception message
public function getCode(); // User-defined Exception code
public function getFile(); // Source filename
public function getLine(); // Source line
public function getTrace(); // An array of the backtrace()
public function getTraceAsString(); // Formated string of trace
/* Overrideable methods inherited from Exception class */
public function __toString(); // formated string for display
public function __construct($message = null, $code = 0);
}
abstract class CustomException extends Exception implements IException
{
protected $message = 'Unknown exception'; // Exception message
private $string; // Unknown
protected $code = 0; // User-defined exception code
protected $file; // Source filename of exception
protected $line; // Source line of exception
private $trace; // Unknown
public function __construct($message = null, $code = 0)
{
if (!$message) {
throw new $this('Unknown '. get_class($this));
}
parent::__construct($message, $code);
}
public function __toString()
{
return 'Error with message : ' . get_class($this) . " '{$this->message}' in {$this->file}(line {$this->line})<br />"
. "{$this->getTraceAsString()}";
}
}
class FTPException extends CustomException {}
?>
sil vous plait , moi j'aurai besoin de votre aide, c'est vraimen important svp.
Nous recevons un fichier .zip sur nos serveurs via ftp contenant une base d'annonces, une base d'utilisateur ainsi que les images liées au annonces. Nous devons récupérer automatiquement ces fichiers dans notre base de donnée en annule et remplace, svp jai besoin d'un script qui me permet de faire sa merci, franchement je vous serez reconnaissant merci.
:)
Autant pour moi, je n'avais pas pensé que l'encodage du fichier était en utf-8 + bom, j'utilise Edit+ et comme j'avais réglé ANSI par défaut, je croyais que tout fichier modifié été enregistré dans ce format, hors l'ANSI n'est appliqué par défaut que sur les nouveaux fichiers, les anciens gardent leur format. Quand on y réfléchi c'est préférable.
Pour les étoiles, pas étonnant, ce site comporte encore des bugs, moi j'ai déjà eu des post qui ont disparus.
Sinon cette classe n'est pas mal, mais je ne suis pas un as des classes PHP BJ33 a un avis bien plus sure que le mien, alors attendons et laissons les grands parler...
<<Tu voudrais que j'approfondisse ma classe d'exception bj33 ?
Juste en savoir plus sur le type d'exception, où elle se déclenche, etc.
abstract class Customise extends Exception implements IException {
protected $message = 'Exception inconnue. Unknown exception';
private $chaine;
protected $code = 0;
protected $fichier;
protected $ligne;
private $trace;
public function __construct($message null, $code 0) {
if (!$message) {
throw new $this('Inconnu/Unknown '. get_class($this));
}
parent::__construct($message, $code);
}
public function __toString() {
return get_class($this)." '{$this->message}' dans {$this->file} ligne({$this->line})\r\n"."{$this->getTraceAsString()}";
}
}
include_once 'Classes/Erreurs/Exceptions/Customise.php';
class Generique extends Customise implements IException {}
interface IException {
public function getMessage();
public function getCode();
public function getFile();
public function getLine();
public function getTrace();
public function getTraceAsString();
public function __toString();
public function __construct($ch_exception,$code = 0);
}
<<Qu'est-ce qui ne va pas ?
Assignation dans une condition.
<<La classe ne déclare pas de bom
évidement, un BOM c'est une suite de métacaractères. Or elle est encodée en UFT-8 avec bom.
http://fr.wikipedia.org/wiki/Indicateur_d%27ordre_des_octets
En clair, il faut virer ce bom, notepad++ fait çà très bien, ou changer l'encodage.
<<que veux-tu dire au sujet des étoiles, moi j'en ai bien 10 et quand je sélectionne la 8 j'en ai bien 8 de prisent
Ce n'est la première fois, parfois il divise au lieu de multiplier.
La classe ne déclare pas de bom, elle ne devrait donc pas altérer l'échange, de plus la connexion effectuée l'affichage des données fonctionne sans sourciller, comment expliquer cela ??? Je suis peut-être nulle (allez savoir) mais j'aime comprendre !
bj33 : que veux-tu dire au sujet des étoiles, moi j'en ai bien 10 et quand je sélectionne la 8 j'en ai bien 8 de prisent ???
Bonne prog.
@+ JLN
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.