Bonjour à tou(te)s,

J'utilise la classe sFtp pour faire des transferts FTP:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
		require_once $urlRepApp."class/sftp.class.php";
		$sftp = new SFTPConnection($serveur);
		//$ret .= "<tr><td align='center'>Connexion FTP ouverte.</td></tr>";
		$sftp->login($login, $passe);
		foreach ($tabFicGen2 as $file) {
			if (file_exists($file)) {
				$sftp->uploadFile($file, $ChemRep.basename($file)); // Receive Send
			} 
		} // */
La classe :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
<?php
 
class SFTPConnection {
	private $connection;
	private $sftp;
 
	public function __construct($host, $port=22) {
		$this->connection = @ssh2_connect($host, $port);
		if (! $this->connection) {
			throw new Exception("Could not connect to $host on port $port.");
		} //else echo "Connexion OK.<br />";
	}
 
	public function login($username, $password) {
		if (! @ssh2_auth_password($this->connection, $username, $password))
			throw new Exception("Could not authenticate with username $username and password $password.");
		$this->sftp = @ssh2_sftp($this->connection);
		if (! $this->sftp) {
			throw new Exception("Could not initialize SFTP subsystem.");
		} //else echo "Authentification OK.<br />";
	}
 
	public function uploadFile($local_file, $remote_file) {
		$sftp = $this->sftp;
		$stream = @fopen("ssh2.sftp://$sftp$remote_file", 'wb');
		if (! $stream) {
			throw new Exception("Could not open file: $remote_file");
		} //else echo "Ouverture fichier OK.<br />";
		$data_to_send = @file_get_contents($local_file);
		if ($data_to_send === false)
			throw new Exception("Could not open local file: $local_file.");
		if (@fwrite($stream, $data_to_send) === false)
			throw new Exception("Could not send data from file: $local_file.");
		@fclose($stream); // */
	}
 
	function scanFilesystem($remote_file) {
		$sftp = $this->sftp;
		$dir = "ssh2.sftp://$sftp$remote_file";
		$tempArray = array();
		$handle = opendir($dir);
		// List all the files
		while (false !== ($file = readdir($handle))) {
			if (substr("$file", 0, 1) != ".") {
				if(is_dir($file)){
					// $tempArray[$file] = $this->scanFilesystem("$dir/$file");
				} else {
					$tempArray[]=$file;
				}
			}
		}
		closedir($handle);
		return $tempArray;
	}    
 
    public function receiveFile($remote_file, $local_file) {
		$sftp = $this->sftp;
		$stream = @fopen("ssh2.sftp://$sftp$remote_file", 'r');
		if (! $stream)
			throw new Exception("Could not open file: $remote_file");
		$contents = fread($stream, filesize("ssh2.sftp://$sftp$remote_file"));            
		file_put_contents ($local_file, $contents);
		@fclose($stream);
    }
 
	public function deleteFile($remote_file){
		$sftp = $this->sftp;
		unlink("ssh2.sftp://$sftp$remote_file");
	} 
}
 
/*echo "Tentative de connexion SCP.<br /><br />";
function my_ssh_disconnect($reason, $message, $language) {
	printf("Server disconnected with reason code [%d] and message: %s\n", $reason, $message);
}
//Notification à l'utilisateur si le serveur termine la connexion
$methods = array('kex'=>'diffie-hellman-group1-sha1',
	'client_to_server'=>array('crypt'=>'3des-cbc', 'comp'=>'none'),
		'server_to_client'=>array('crypt'=>'aes256-cbc,aes192-cbc,aes128-cbc', 'comp'=>'none'));
$callbacks = array('disconnect'=>'my_ssh_disconnect');
echo "Lancement de la connexion.<br /><br />";
$conn_id = ssh2_connect($serveur, 22); // , $methods, $callbacks
echo "Connexion lancée ($conn_id).<br /><br />";
$fingerprint = ssh2_fingerprint($conn_id, SSH2_FINGERPRINT_MD5 | SSH2_FINGERPRINT_HEX);
echo "Empreinte retournée ($fingerprint).<br /><br />";
if ($conn_id) {
	echo "Connexion ouverte ($conn_id).<br /><br />";
	if (ssh2_auth_password($conn_id, $login, $passe)) { // Identification avec un nom d'utilisateur et un mot de passe
		echo "Utilisateur connecté.<br /><br />";
		ssh2_scp_send($connection, '/local/filename', '/remote/filename', 0644);
		if (ssh2_scp_send($conn_id, $file, "/Receive/".$file, 0644)) { // Tente de charger le fichier $file
			echo "Chargement avec succès du fichier $file\n";
		} else 
			echo "Il y a eu un problème lors du chargement du fichier $file<br /><br />";
	} else
		echo "Connexion impossible en tant que '".$login."'<br /><br />";
} else 
	echo "Impossible de se connecter au serveur.<br /><br />"; // */
 
/*echo "Tentative de connexion FTP.<br /><br />";
$conn_id = ftp_connect($serveur, 22); // Mise en place d'une connexion basique "sftp://83.167.36.240"
echo "Connexion lancée ($conn_id).<br /><br />";
if ($conn_id) {
	echo "Connexion ouverte ($conn_id).<br /><br />";
	if (ftp_login($conn_id, $login, $passe)) { // Identification avec un nom d'utilisateur et un mot de passe
		echo "Utilisateur connecté.<br /><br />";
		if (ftp_fput($conn_id, $file, $fp, FTP_ASCII)) { // Tente de charger le fichier $file
			echo "Chargement avec succès du fichier $file\n";
		} else 
			echo "Il y a eu un problème lors du chargement du fichier $file<br /><br />";
	} else
		echo "Connexion impossible en tant que '".$login."'<br /><br />";
} else 
	echo "Impossible de se connecter au serveur.<br /><br />"; // */
 
?>
Les fichiers sont biens copiés sur le serveur, seulement, il sont altérés.
Ils font une 20 aine d'octets de moins que les originaux: Les Zip sont corrompus et les images JPG sont à 90% noires (il n'y a que le bandeau haut de l'image qui est bon)

J'ai fait des transferts via WinScp (un logiciel avec une interface graphique) et tout se passe très bien.

Il faut dire que mon serveur est un SUZE et le serveur distant est un Windows 2000.
C'est pourquoi j'ai mis l'option "b" à fOpen().

Avez vous d'autres techniques de transfert (il faut que ce soit du SFTP) ou des idées ?

Merci d'avance.

David