Discussion:
FTP_RAW et commande STOR
(trop ancien pour répondre)
Josuke 666
2007-01-23 11:06:39 UTC
Permalink
FTP_RAW et commande STOR

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);

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.
Olivier Miakinen
2007-01-23 14:16:19 UTC
Permalink
Post by Josuke 666
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.
Ok.
Post by Josuke 666
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 ?
Tu dois lire le fichier, pas nécessairement le stocker dans une
variable, mais l'envoyer sur le flux de données (différent du flux de
commande ouvert par ftp_connect), que tu dois soit ouvrir toi-même, soit
demander au serveur d'ouvrir (selon que tu es en mode passif ou non).

Voir par exemple <http://www.commentcamarche.net/internet/ftp.php3>.
Post by Josuke 666
Je ne dois pas avoir la bonne syntaxe, est-ce quelqu'un peut m'aider ?
Surtout, tu dois faire soit un connect soit un accept à un moment donné,
que tu ne fais pas.
Josuke 666
2007-01-23 23:22:50 UTC
Permalink
Post by Olivier Miakinen
Post by Josuke 666
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 ?
Tu dois lire le fichier, pas nécessairement le stocker dans une
variable, mais l'envoyer sur le flux de données (différent du flux de
commande ouvert par ftp_connect), que tu dois soit ouvrir toi-même, soit
demander au serveur d'ouvrir (selon que tu es en mode passif ou non).
Voir par exemple <http://www.commentcamarche.net/internet/ftp.php3>.
Post by Josuke 666
Je ne dois pas avoir la bonne syntaxe, est-ce quelqu'un peut m'aider ?
Surtout, tu dois faire soit un connect soit un accept à un moment donné,
que tu ne fais pas.
salut Olivier, merci pour ta réponse.

Pour info le ftp distant refuse les connexions en mode passif.

Voici ce qu'affiche le script (sans modification) quand je l'exécute :

Array
(
[0] => 331 User name okay, need password.
)

Array
(
[0] => 230 User logged in, proceed.
)

Array
(
[0] => 215 UNIX Type: L8
)

Array
(
[0] => 200 Type set to I.
)

Array
(
[0] => 550 monfichier.zip: Cannot create file.
)

Array
(
[0] => 221 Goodbye!
)



J'ai bien les droits en écriture avec le compte test.

Après plusieurs tests, j'arrive à créer le fichier sur le serveur
distant mais il est vide.

J'ai modifié deux lignes de mon script :

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

et j'obtiens :

Array
(
[0] => 150 Opening BINARY mode data connection for monfichier.zip.
)

Array
(
[0] => 221 Goodbye!
)



Tu as donc raison, j'ai l'impression que le ftp attend ensuite le flux
de données (contenu du zip).

Pour moi c'est un peu mystérieux, je retourne sur le lien qui tu m'as
communiqué.

Si je suis ce que tu m'indique, je dois ouvrir un socket pour démarrer
l'échange ?


Merci à tous les lecteurs de ce post pour leur aimable contribution.

TheFooL aka josuke666
Olivier Miakinen
2007-01-24 16:49:34 UTC
Permalink
Post by Josuke 666
Si je suis ce que tu m'indique, je dois ouvrir un socket pour démarrer
l'échange ?
Oui. Si je me rappelle bien, tu dois ouvrir un socket et te mettre en
attente de connexion dessus. Tu dois aussi récupérer l'adresse et le
port de ce socket (par exemple 192.168.3.7 et 1035). Tu dois ensuite
envoyer ces infos au serveur, en décimal, octet par octet, avant (ou
après, je ne sais plus) de donner ta commande de STOR :
PORT 192,168,3,7,4,11
Enfin, lorsque la communication est établie sur l'autre socket, tu y
envoies le contenu du fichier et à la fin tu fermes la socket.

Enfin voilà, c'est un truc comme ça. Au fait, pourquoi ne pas utiliser
ftp_put qui fait tout ça pour toi ? Parce que le fichier n'existe pas
physiquement sur ton disque ?

P'tit Marcel
2007-01-23 14:16:19 UTC
Permalink
Post by Josuke 666
Je souhaite uploader un fichier par ftp et récupérer le message de
reussite spécifique retourné par le serveur.
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 ?
...

Qu'est ce qu'affiche ton script à l'exécution ? Spécifiquement, quellle
est la réponse du serveur FTP à la commande STOR ? As-tu essayé la
syntaxe STOR nomdufichier nomdufichier ?

Est-ce que le compte test a le droit d'écrire sur son répertoire initial?

As-tu essayé la commande PUT ? D'ailleurs, quelqu'un peut-il expliquer
simplement la différence entre les syntaxes put/get et retr/stor ?


eça
--
P'tit Marcel
stats sur les forums modérés http://www.centrale-lyon.org/ng/
Josuke 666
2007-01-23 23:22:50 UTC
Permalink
Post by P'tit Marcel
Post by Josuke 666
Je souhaite uploader un fichier par ftp et récupérer le message de
reussite spécifique retourné par le serveur. J'utilise donc la
fonction ftp_raw.
...
Qu'est ce qu'affiche ton script à l'exécution ? Spécifiquement, quellle
est la réponse du serveur FTP à la commande STOR ? As-tu essayé la
syntaxe STOR nomdufichier nomdufichier ?
Est-ce que le compte test a le droit d'écrire sur son répertoire initial?
As-tu essayé la commande PUT ? D'ailleurs, quelqu'un peut-il expliquer
simplement la différence entre les syntaxes put/get et retr/stor ?
Salut Marcel,

D'abord merci pour ta réponse.

Voici ce qu'affiche le script quand je l'exécute :

Array
(
[0] => 331 User name okay, need password.
)

Array
(
[0] => 230 User logged in, proceed.
)

Array
(
[0] => 215 UNIX Type: L8
)

Array
(
[0] => 200 Type set to I.
)

Array
(
[0] => 550 monfichier.zip: Cannot create file.
)

Array
(
[0] => 221 Goodbye!
)



J'ai bien les droits en écriture avec le compte test.

Après plusieurs tests, j'arrive à créer le fichier sur le serveur
distant mais il est vide.

J'ai modifié deux lignes de mon script :

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

et j'obtiens :

Array
(
[0] => 150 Opening BINARY mode data connection for monfichier.zip.
)

Array
(
[0] => 221 Goodbye!
)



On touche au but, si vous avez d'autres suggestions, je suis preneur.


TheFooL aka Josuke666 :)
P'tit Marcel
2007-01-24 00:00:29 UTC
Permalink
Post by Josuke 666
Post by P'tit Marcel
Qu'est ce qu'affiche ton script à l'exécution ? Spécifiquement,
quellle est la réponse du serveur FTP à la commande STOR ?
Est-ce que le compte test a le droit d'écrire sur son répertoire initial?
[0] => 550 monfichier.zip: Cannot create file.
J'ai bien les droits en écriture avec le compte test.
Ben non, si le serveur FTP répond "cannot create file", c'est que les
droits ne sont pas là... ou que le disque/quota est plein.
Post by Josuke 666
$monfichier = './monfichier.zip';
print_r(ftp_raw($ftp, "STOR $monfichier")); flush(); echo '<br>';
Array
(
[0] => 150 Opening BINARY mode data connection for monfichier.zip.
)
C'est déjà plus encourageant mais pas suffisant. La commande devrait
renvoyer en plus une réponse finale positive, genre 2nn



a+
--
P'tit Marcel
stats sur les forums modérés http://www.centrale-lyon.org/ng/
Continuer la lecture sur narkive:
Loading...