ftp_put function

Petit nouveau ! | 1 Messages

23 sept. 2013, 10:56

Bonjour tout le monde,

Je rencontre actuellement des problèmes pour l'utilisation de la fonction "ftp_put", pour uploader des fichier sur mon server (utilisant FileZilla).

Comment utiliser cette fameuse fonction "ftp_put" ?

Voici mon code:
echo "<Form method='Post' enctype='multipart/form-data'>";

$ftp = ftp_connect("*********", 21);

if ($ftp) {
	echo "Server Connection : OK .....";
	$ftp_login = ftp_login($ftp, "User", "****");
	if ($ftp_login) {
		echo "</BR>";
		echo "User Connection : OK .....";
		if(ftp_pasv($ftp,true)) {
			echo "</BR>";
			echo "Mode passif : OK .....";
			echo "</BR>";
			
				if(isset($_POST['upl'])) {
					if($_FILES['up'] != "") {
						echo "</BR>";
						$file1 = $_FILES['up']['tmp_name'];
						$file2 = $_FILES['up']['name'];
						if (is_dir('./Test')) {
							echo "Folder Exist";
							echo "</BR>";
							echo $file1;
							echo "</BR>";
							echo $file2;
							$ftp_put = ftp_put($ftp, $file1, $file2, FTP_ASCII);
							if ($ftp_put) {
								echo "Download : OK .....";
							} else {
								echo "</BR>";
								echo "Download : Not OK .....";
								echo "</BR>";
							}
						} else {
							echo "Folder not exist";
						}
						
						echo "</BR>";
					} Else {
						echo "Choisir un fichier";
						echo "</BR>";
					}					
				}
				echo "Telecharger fichier : <input type='file' name='up'></Input>";
				echo "</BR>";
				echo "<input type='submit' name='upl' Value='Upload'></Input>";
			
		}else{
			echo "</BR>";
			echo "error mode passif";
		}
	} Else {
		echo "User Connection : Not OK";
	}
} else {
	echo "Connection Not OK";
}

echo "</Form>";
En utilisant la fonction actuelle j'obtiens une erreur :
Warning: ftp_put(Change_Password_v1.0.1.$w$) [function.ftp-put]: failed to open stream: No such file or directory in D:\xampp\htdocs\Test\index.php on line 29

-> Le dossier de destination est bien présent, j'ai mis tous les droit sur dossier pour l'utilisateur "User"...



Je ne sais pas quels parametres utiliser dans la fonction...
- 1er argument : parametre de la connection ftp
?- 2eme argument : destination du fichier à copier sur le server (Doit-on préciser un nom de fichier ou juste le dossier ou doit-être copier le fichier ?)
- 3eme argument : Chemin local du client ou est le fichier ?
- 4eme argument : FTP_ASCII ou FTP_BINARY ? quelle différence ??

Merci de m'éclairer un peu sur le sujet :D

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

24 sept. 2013, 21:08

Bonjour, c'est une erreur souvent rencontrée due à l'inversion des paramètres fichier_distant et fichier_local de la fonction ftp_put().
La syntaxe est :
bool ftp_put ( resource $ftp_stream , string $remote_file , string $local_file , int $mode [, int $startpos = 0 ] )
1. Le paramètre $remote_file doit être le nom du fichier qui sera enregistré sur le site distant accédé par FTP. Il doit contenir le chemin complet (dossier+nom du fichier destination). Dans ton cas il s'agit de $_FILES['up']['name'] le nom d'origine du fichier uploadé que tu dois précédé par le nom du dossier cible que tu as nommé './Test' dans ton programme.

2. Le paramètre $local_file est le nom du fichier temporaire qui a été uploadé et qui se trouve dans $_FILES['up']['tmp_name']

Tu as compris donc qu'il faut inverser l'ordre des variables $file1 et $file2 dans la fonction ftp_put(). Correction :
$ftp_put = ftp_put($ftp, $file2, $file1, FTP_BINARY);
Bon, j'ai utilisé le mode binaire FTP_BINARY pour bien transmettre le fichiers binaires comme Word, Excel, ...

Pour information aussi je pense que le test d'existence du dossier ftp cible avec la fonction is_dir() ne fonctionnera par pour un dossier distant (FTP) il faut donc virer ce IF (is_dir())

Pour correction voici le même programme réadapté :
<form method='Post' enctype='multipart/form-data'>
<h1>FTP</h1>
<li>Telecharger fichier : <input type='file' name='up'></Input></li>
<li><input type='submit' name='upl' Value='Upload'></Input></li>
</form>

<?php   
if(isset($_POST['upl']) && $_FILES['up'] != "") {
	$ftp = ftp_connect("******************", 21);
	if ($ftp) {
		echo "<li>Connexion : OK .....</li>";
		$ftp_login = ftp_login($ftp, "*******************", "*****************");
		if ($ftp_login) {
			echo "<li>Login : OK .....</li>";
			if(ftp_pasv($ftp,true)) {
				echo "<li>Mode passif : OK .....</li>";
				$dir = './Test/';
				$file_to_upload = $_FILES['up']['tmp_name'];
				$file_name_to_save = $dir.$_FILES['up']['name'];
				
				echo '<li>Nom Fichier local a telecharger (temp) : '.$file_to_upload.'</li>';
				echo '<li>Nom Fichier distant de sauvegarde : '.$file_name_to_save.'</li>';
				
				//ecriture binaire recommandee
				$ftp_put = ftp_put($ftp, $file_name_to_save, $file_to_upload, FTP_BINARY);
				if ($ftp_put) {
					echo "<li>Telechargement : OK .....</li>";
				} else {
					echo "<li>Telechargement : Pas OK .....</li>";
				}               
			} else {
				echo "<li>Erreur mode passif</li>";
			}
		} else {
			echo "<li>Login : Pas OK</li>";
		}
	} else {
		echo "<li>Connexion OK</li>";
	}
} else {
	echo "<li>Choisir un fichier</li>";
}   
?>
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène