Copy() et context

Résolu
kishkaya Messages postés 365 Date d'inscription samedi 26 juin 2004 Statut Membre Dernière intervention 17 avril 2008 - 22 août 2007 à 11:40
kishkaya Messages postés 365 Date d'inscription samedi 26 juin 2004 Statut Membre Dernière intervention 17 avril 2008 - 22 août 2007 à 16:37
Bonjour,
Afin de transferé des fichier d'un serveur vers un autre j'utilise le protocole FTP.
La fonction copy autorisant les url distante je voulais m'en servir.

Malheureusement l'envoie de fichier ftp echoue quand on veut ecraser un fichier existant. Il est indiquer sur php.net :

"Si vous devez réécrire des fichiers existants
en utilisant ftp, spécifiez l'option <var>overwrite</var> dans le
contexte et ouvrez le fichier en écriture".

Or, la fonction copy n'admet pas de contexte, dois je donc comprendre que je n'ai pas d'autre choix que d'utiliser fopen ?

_Marikou

5 réponses

Yoteco Messages postés 111 Date d'inscription lundi 20 octobre 2003 Statut Membre Dernière intervention 5 novembre 2008
22 août 2007 à 12:24
Salut,

Oui... ou alors regarde d'abord si le fichier existe déjà sur le serveur FTP supprime le et envoie le nouveau fichier.

Ce qui est incompréhensible, c'est que le monde soit compréhensible. (Albert Einstein)
3
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
22 août 2007 à 14:13
Hello,

non :
Note:
Depuis PHP 4.3.0, les deux paramètres <tt>source</tt> et
<tt>dest</tt> peuvent être des URL si les gestionnaires
d'URL ont été activés. Voyez la fonction
fopen() pour plus de détails.
Si <tt>dest</tt> est une URL, la copie peut échouer si
ce protocole ne supporte pas l'écrasement de fichiers existants.

Cela veut dire que si tu fais un truc du genre
copy('ftp://serveurftp1/bla.txt', 'ftp://monftp.com/bla.txt');
il faut que la configuration de ton php le tolère (et que les serveurs aussi évidemment) avec le gestionnaire d'URL. Vois la fonction fopen() pour en savoir plus sur le gestionnaire d'URL et suis les liens. Ca ne veut pas dire que tu dois d'abord utiliser fopen().

Pourquoi n'utilises-tu pas les fonctions ftp_*() dédiées? Ou CURL ?
3
kishkaya Messages postés 365 Date d'inscription samedi 26 juin 2004 Statut Membre Dernière intervention 17 avril 2008
22 août 2007 à 15:00
Bonjour et merci pour vos réponses.
J'utilise la fonction copy et j'arrive à copier sur mon ftp (où j'ai un user anonymous) un fichier depuis mon premier serveur. Malheureusement je ne peux copier qu'un fichier qui n'existe pas déjà.
Le protocole FTP accepte l'ecrasement de fichier. Mais je ne sais pas comment le mettre par default.

1- J'ai utilisé copy car je savais qu'elle acceptait ce protocole et les adresses distantes. De plus avec les fonction ftp_* le probleme est qu'elles renvoient "true" lorsque l'ordre a été PASSE sur le serveur FTP et non pas quand il a été EXECUTE. J'utilise le ftp pour copier des fichiers sons. Puis je lance l'encodage du fichier son à l'aide d'un GET HTTP sur le serveur 2 (celui ou se trouve le FTP). Mais l'encodage plante souvent car le FTP n'a pas fini de copier le fichier son (et cela avec ftp_put ou ftp_fput).


La deuxieme raison qui m'a fait ne pas choisir les fonction ftp_* est celle la :

"Si vous voulez uniquement
lire ou écrire un fichier sur un serveur FTP, utilisez plutôt le gestionnaire
<var>ftp://</var> wrapper
avec les fonctions de système de fichiers
qui fournissent une interface simple et intuitive" (cf php.net)

2- je n'ai pas utilisé curl car je ne sais pas si il est inclu de base en tant qu'extension de php... Et parce que je ne connait pas bien ce module.

Je me renseigne sur Curl. en attendant si vous savez comment mettre le mode Overwrite par defaut pour les protocoles SFTP et FTP je suis tres prenneur.

_Marikou
0
kishkaya Messages postés 365 Date d'inscription samedi 26 juin 2004 Statut Membre Dernière intervention 17 avril 2008
22 août 2007 à 16:34
Mea culpa !!!
Les fonctions FTP marchent tres bien, je m'en suis rendu compte en utilisant libcurl!
En fait le probleme venait du transfert FTP ascii ou binaire.
Avec Curl je desactivais les entetes textuelles et au final le fichier son s'encodait bien une fois l'encodage lancé). Lorsque je les ai activées, l'encodage echoué.
Je viens de retenter avec les fonctions ftp_put/ftp_get ca marche nickel quand on fait la transaction en binaire (FTP_BINARY) !!.

Donc j'ai dit des conneries, ces fonctions renvoient bien true lorsque l'ordre a été EXECUTE.

Merci a vous deux pour votre aide ca marche nickel maintenant.

_Marikou
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
kishkaya Messages postés 365 Date d'inscription samedi 26 juin 2004 Statut Membre Dernière intervention 17 avril 2008
22 août 2007 à 16:37
A titre d'exemple voila comment on fait avec curl pour envoyer un fichier via FTP:

$tosend = fopen('monfichieraenvoyé.wav',r);
$easyhandle = curl_init('ftp://xxx.xxx.xxx.xxx/fichierupload.wav');
curl_setopt($easyhandle, CURLOPT_INFILE, $tosend);
curl_setopt($easyhandle, CURLOPT_UPLOAD, TRUE);
curl_setopt($easyhandle, CURLOPT_TRANSFERTEXT, FALSE);
if (!curl_exec($easyhandle)) { echo 'error'; };
curl_close ($easyhandle);
fclose($tosend);

et pour en telecharger un :
$toget = fopen('fichiertelecharge.wav','w');
$easyhandle=curl_init('ftp://xxx.xxx.xxx.xxx/sondistant.wav');
curl_setopt($easyhandle, CURLOPT_FILE, $toget);
curl_setopt($easyhandle, CURLOPT_UPLOAD, FALSE);
curl_setopt($easyhandle, CURLOPT_TRANSFERTEXT, FALSE);
curl_setopt($easyhandle, CURLOPT_HEADER, 0);
if (!curl_exec($easyhandle)) { echo 'error'; };

curl_close ($easyhandle);

fclose($tosend

_Marikou
0
Rejoignez-nous