Transférer un fichier d’un serveur vers un autre
Après les commentaires laissés sur mon article ‘Barre de progression pour upload en PHP/AJAX/APC’, je me suis rendu compte que les besoins de certains développeurs étaient bien différents. En effet, pour la plupart d’entre-eux, il n’était pas forcement question d’uploader des fichiers, mais plus simplement, de les transférer d’un serveur vers un autre. Et bien entendu, l’upload avec le module APC d’apache n’était plus nécessaire.
1re étape: récupérer le fichier
Lorsque j’ai commencé à développer ce petit outil, je me suis posé une seule question (la plus évidente), comment réaliser le transfert d’un fichier qui se trouve sur un serveur, vers le mien ? La réponse était toute simple, exactement comme le ferait votre navigateur favori : une connexion socket sur le port 80.
Pour résumer la situation, lorsque vous souhaitez afficher la page d’un site internet, une première requête est envoyée au serveur :
http://www.adrien-ruiz.fr/dev/copysocket.zip
GET /dev/copysocket.zip HTTP/1.1
Host: www.adrien-ruiz.fr
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.9.1.11) Gecko/20100701 Firefox/3.5.11
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
etc…
et voici sa réponse:
HTTP/1.1 200 OK
Date: Sat, 21 Aug 2010 15:45:54 GMT
Server: Apache
Last-Modified: Sat, 21 Aug 2010 15:44:49 GMT
Etag: « 66063a-3f3-48e574babdc4f »
Accept-Ranges: bytes
Content-Length: 1011
Keep-Alive: timeout=15, max=99
Connection: Keep-Alive
Content-Type: application/zipPK����øŒ=`£µt��B �� ���socket.phpµVMoÛ8½È`¡²…
Elle se divise en deux parties.
Tout d’abord l’entête http qui contient diverses informations que je ne vais pas expliquer ici, mais pour les plus curieux d’entre vous, c’est par ici.
Ensuite vient le contenu, ici, il s’agit d’une archive zip (copysocket.zip), donc les caractères bizarres correspondent à notre fichier!
2nd étape: écriture du fichier sur mon serveur
En premier lieu, il faut pouvoir distinguer la fin de l’entête http, et le début de notre fichier. Comment ? C’est tout simple, notre entête se termine par une ligne vide contenant uniquement « \r\n ». En somme, dès que cette ligne a été transmise à notre code PHP, c’est qu’il s’agit de notre fichier, on commence donc son écriture sur notre serveur!
Vous avez donc compris qu’avec une simple connexion socket sur le port 80 il est possible de récupérer n’importe qu’elle fichier sur un serveur distant. Toutefois, il sera fort heureusement impossible de récupérer un fichier source PHP puisque nous réalisons ce type de transfert via le port 80 … tout comme un navigateur web …
Dans un prochain article, j’expliquerai comment utiliser ce script de manière transparente avec barre de progression.



Tu aurai utiliser la fonction copy sa aurait pas été plus simple ?
copy("http://www.adrien-ruiz.fr/dev/copysocket.zip", "/tmp/copysocket.zip")Salut salorium,
j’avoue que l’utilisation de cette fonction aurait été plus simple, cependant, en lisant bien la doc de php :
Les paramètres source et dest peuvent désormais être des URL si le gestionnaire de fichiers distants a été activé.
Donc si c’est pas le cas, la copie ne fonctionnera pas.
Pour la suite, il sera question d’y ajouter une barre de progression, donc de connaître la taille totale du fichier à copier. Pour cela, une requête HTTP de type HEAD est nécessaire afin de récupérer la valeur du ‘Content-Length’. Je sais qu’il existe une fonction php qui réalise déjà ce type de requête et qui retourne le tout proprement dans un tableau associatif … mais je ne me souviens plus de qu’elle fonction il s’agit :S.
Après c’est à toi de voir, il est vrai que si la copie fonctionne avec copy, inutile de créer sa propre fonction. Personnellement cela ne m’a pas pris plus d’une heure.
A+
la suite ici : http://www.adrien-ruiz.fr/blog/2010/10/21/copier-un-fichier-distant-sur-son-serveur/