ftp_raw et commande STOR

Dev
Petit nouveau ! | 2 Messages

21 janv. 2007, 20:02

Bonjour à tous,

Je souhaite uploader un fichier par ftp et récupérer le message de reussite spécifique retourné par le serveur. Je connais la commande FTP_PUT mais elle ne convient pas à mon besoin (même si elle marche). J'utilise donc la fonction ftp_raw.

Ma question est la suivante : dois-je envoyer le fichier en indiquant simplement son emplacement ou faut il lire le contenu du fichier, le stocker dans une variable et envoyer le tout ou... suis-je à côté de la plaque ?

Je ne dois pas avoir la bonne syntaxe, est-ce quelqu'un peut m'aider ?

Voici mon code :
<?

$ftp = ftp_connect($ftp_host); flush();

print_r(ftp_raw($ftp, "USER test")); flush(); echo '<br>';
print_r(ftp_raw($ftp, "PASS test")); flush(); echo '<br>';

ftp_set_option($ftp, FTP_TIMEOUT_SEC, 300); // défaut 90

print_r(ftp_raw($ftp, "SYST")); flush(); echo '<br>';
print_r(ftp_raw($ftp, "TYPE I")); flush(); echo '<br>';

print_r(ftp_raw($ftp, 'STOR monfichier.zip')); flush(); echo '<br>';
   
print_r(ftp_raw($ftp, "quit")); flush(); echo '<hr>';

?>
Merci d'avance pour vos contributions,

TheFooL.

Dev
Petit nouveau ! | 2 Messages

24 janv. 2007, 15:55

J'avance dans mes recherches... même si mon post ne suscite pas un engouement phénoménal...

Voici le code modifié :
<pre>
<?
$filename = 'monfichier.zip';
$content = file_get_contents('./'.$filename);

$ftp_host = '192.168.1.101'; // A remplacer 

$ftp = ftp_connect($ftp_host); flush();

$MyArray = ftp_raw($ftp, "SYST");  echo $MyArray[0].'<br>'; flush();
$MyArray = ftp_raw($ftp, "USER test");  echo $MyArray[0].'<br>'; flush();
$MyArray = ftp_raw($ftp, "PASS test");  echo $MyArray[0].'<br>'; flush();

ftp_set_option($ftp, FTP_TIMEOUT_SEC, 300); // défaut 90

$MyArray = ftp_raw($ftp, "PWD");  echo $MyArray[0].'<br>'; flush();
$MyArray = ftp_raw($ftp, "TYPE I");  echo $MyArray[0].'<br>'; flush();
$MyArray = ftp_raw($ftp, "MODE Z");  echo $MyArray[0].'<br>'; flush();

$MyArray = ftp_raw($ftp, "PASV");  echo $MyArray[0].'<br>'; flush();
$MyArray = ftp_raw($ftp, "STOR $filename");  echo $MyArray[0].'<br>'; flush();

$MyData = array();
$MyData = explode(' ',$MyArray[0]);

$full_ip = str_replace('(','',$MyData[4]);
$full_ip = str_replace(')','',$full_ip);
$Full_ip = explode(',',$full_ip);
$ip = $Full_ip[0].'.'.$Full_ip[1].'.'.$Full_ip[2].'.'.$Full_ip[3];
$port = $Full_ip[4]*256+$Full_ip[5];
echo $ip.':'.$port.'<br>'; flush();

$fp = fsockopen($ip, $port, $errno, $errstr, 30);

if (!$fp) {
    echo "$errstr ($errno)<br>\n";
} else {
	echo 'Canal de transfert pret !<br>';


	// Ecrivons quelque chose dans notre fichier.
	if (fwrite($fp, $content) === FALSE) {
	   echo "Impossible d'écrire dans le fichier";
	   exit;
	} else {
		echo "L'écriture de dans le fichier distant a réussi<br>";
	}
	fclose($fp);
}

$MyArray = ftp_raw($ftp, "QUIT");  echo $MyArray[0].'<br>'; flush();

?>
</pre>

Ca ouvre la connexion, le serveur FTP attend un flux de données mais rien ne se passe. Je dois faire une erreur dans mon script.

Voici la sortie :
215 UNIX Type: L8
331 User name okay, need password.
230 User logged in, proceed.
257 "/" is current directory.
200 Type set to I.
200 MODE Z ok.
227 Entering Passive Mode (192,168,1,101,17,24)
Qqun a une idée ?

Merci d'avance. TheFooL

Petit nouveau ! | 9 Messages

31 janv. 2007, 22:42

As tu essayer avec un serveur FTP sur le même poste qui lance le PHP (Ftp en locahost)?
(Essai avec http://filezilla.sourceforge.net/)

J'ai eu le même problème, mais c'était a cause du parametrage d'un router (NAT) lorque j'utilise le mode PASV.

Avec ce lien tu pourras au moin tester le mode PASV de ton serveur FTP :
http://www.g6ftpserver.com/fr/ftptest

C'est peux être pas ça, mais c'est souvent le Pb PASV avec les serveurs FTP.

Petit nouveau ! | 9 Messages

31 janv. 2007, 22:53

Au fait, ta sortie PHP te retourne quoi?
echo $ip.':'.$port.'<br>'; flush(); 
echo "$errstr ($errno)<br>\n"; 
echo 'Canal de transfert pret !<br>'; 
echo "Impossible d'écrire dans le fichier"; 
echo "L'écriture de dans le fichier distant a réussi<br>"; 
Si ça bloque avant...
Peux tu placer un "echo" et un "flush" avant "ftp_raw($ftp, "STOR $filename");"