[PHP] Copier un fichier qui se trouve sur internet

Copier un fichier qui se trouve sur internet [PHP] - PHP - Programmation

Marsh Posté le 01-02-2003 à 11:08:32    

Imaginons que je veuille copier le fichier image se trouvant a http://www.site.com/tutures/photos/1.jpg  
comment faire puisque :  
copy("http://www.site.com/tutures/photos/1.jpg", "photos/1.jpg" );  
ne marche pas  
 
J'ai fait quelques recherches mais sans trop de succès, en fait j'ai le code suivant :
 

Code :
  1. $fp = fopen("http://www.fhm.com/girls/100sexiest/results/img/large/9.jpg","r" ); //lecture du fichier
  2. while (!feof($fp)) //on parcoure toutes les lignes
  3. {
  4.   $contenu .= fgets($fp); // lecture du contenu de la ligne
  5. }
  6. fclose($fp);
  7. if($fp2 = fopen("test_9.jpg","a" )) // ouverture du fichier en écriture
  8. {
  9.   fputs($fp2, $contenu); // on écrit dans le fichier
  10.   fclose($fp2);
  11. }
  12. else // L'ouverture a échouée
  13. {
  14.   echo "Ouverture du fichier impossible";
  15.   exit();
  16. }


 
Mais le fichier "test_9.jpg" qui est créer ne semble pas être bon (image corrupue en sommes). Je ne vois pas où ça merde car, j'ai fait des tests avec des url comme http://toofoot.net.free.fr et le fichier qui est créer contient bien le code source de ce superbe site sur le Foot (qui a dit Promo ??   :D  ).
 
Merci de me mettre sur la (bonne) voie :)


Message édité par _Raynor_ le 01-02-2003 à 11:19:02
Reply

Marsh Posté le 01-02-2003 à 11:08:32   

Reply

Marsh Posté le 01-02-2003 à 12:02:24    

tu ferais peut être mieux de passer par les fonctions de manipulation d'image (imagecreatefromjpeg par ex.)


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

Marsh Posté le 01-02-2003 à 12:18:52    


http://www.php.net/manual/en/function.fopen.php
 
Newbie advice: The little "b" for binary operations is very essential when working with PHP4 and Apache on the win32 platform. fread() only reads a couple of hundred bytes when reading for example an image without "b".  
// Read tempfile data into $thumb_img.  
$thumb_file_size = filesize('C:\\Temp\\temp.jpg';);  
$fp = fopen('C:\\Temp\\temp.jpg', "rb");  
$thumb_data = addslashes (fread ($fp, $thumb_file_size));  
fclose ($fp);  
unlink('C:\\Temp\\temp.jpg';);

Reply

Marsh Posté le 01-02-2003 à 13:57:26    

Je n'arrive pas a comprendre, ok je dois mettre un b quelque part dans un fopen mais lequel ?

Reply

Marsh Posté le 01-02-2003 à 16:21:23    

Code :
  1. <?php
  2. function getFic( $pic )
  3. {
  4. // Ouverture d'une connexcion au site
  5. $fp = fsockopen( "www.fhm.com", 80, &$errno, &$errstr, 30 );
  6. if( $fp )
  7. {
  8.  // Demande le fichier
  9.  fputs( $fp, "GET http://www.fhm.com/girls/100sexies [...] large/$pic HTTP/1.1 \n\n" );
  10.  $buff = "";
  11.  // Lecture du fichier
  12.  while( ! feof( $fp ) )
  13.  {
  14.   $buff .= fread( $fp, 256 );
  15.  }
  16.  // Fermeture de la conexion
  17.  fclose( $fp );
  18.  // Ouverture du fichier local
  19.  $h = fopen( $pic, 'w+' );
  20.  // Le buffer contient l'en-tête HTTP, qu'il faut passer.
  21.  // L'image étant de type, JPG, on se repère sur la chaîne 'JFIF' au début de l'image.
  22.  $pos = strpos( $buff, "JFIF" ) - 6;
  23.  // Ecriture du buffer
  24.  fwrite( $h, substr( $buff, $pos ) );
  25.  fclose( $h );
  26. }
  27. }
  28. // Boucle de génération des noms de fichiers à lire ( de 1.jpg à 100.jpg)
  29. for( $i = 1; $i <= 10; $i++ )
  30. {
  31. $pic = sprintf( "%d.jpg", $i);
  32. if( ! file_exists( $pic ) )
  33. {
  34.  getFic( $pic );
  35. }
  36. }
  37. ?>


 
Testé et approuvé !
Jolies photos ! ! !


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 01-02-2003 à 17:42:39    

Je ne suis pas encore arrivé a le faire marcher sur mon PC, mais aucuns problèmes sur mon Linux.
Je vais le décortiquer pour mieux comprendre son fonctionnement, en tout cas, merci !

Reply

Marsh Posté le 01-02-2003 à 17:47:15    

mauvais emploi de feof, directment hérité du C, ce n'est pas le eof de pascal. il faut tester les retours des fonctions d'E/S (voir doc)

Reply

Marsh Posté le 01-02-2003 à 18:12:01    

J'ai pas encore compris l'idée des en-têtes HTTP et de la chaîne "JFIF" mais imaginons que les images voulues soient des .bmp ou bien des .jpe, qu'elles devraient être les modifications ? l'en-tête seulement ?

Reply

Marsh Posté le 01-02-2003 à 18:43:07    

Mara's dad a écrit :

Code :
  1. <?php
  2. function getFic( $pic )
  3. {
  4. // Ouverture d'une connexcion au site
  5. $fp = fsockopen( "www.fhm.com", 80, &$errno, &$errstr, 30 );
  6. if( $fp )
  7. {
  8.  // Demande le fichier
  9.  fputs( $fp, "GET http://www.fhm.com/girls/100sexies [...] large/$pic HTTP/1.1 \n\n" );
  10.  $buff = "";
  11.  // Lecture du fichier
  12.  while( ! feof( $fp ) )
  13.  {
  14.   $buff .= fread( $fp, 256 );
  15.  }
  16.  // Fermeture de la conexion
  17.  fclose( $fp );
  18.  // Ouverture du fichier local
  19.  $h = fopen( $pic, 'w+' );
  20.  // Le buffer contient l'en-tête HTTP, qu'il faut passer.
  21.  // L'image étant de type, JPG, on se repère sur la chaîne 'JFIF' au début de l'image.
  22.  $pos = strpos( $buff, "JFIF" ) - 6;
  23.  // Ecriture du buffer
  24.  fwrite( $h, substr( $buff, $pos ) );
  25.  fclose( $h );
  26. }
  27. }
  28. // Boucle de génération des noms de fichiers à lire ( de 1.jpg à 100.jpg)
  29. for( $i = 1; $i <= 10; $i++ )
  30. {
  31. $pic = sprintf( "%d.jpg", $i);
  32. if( ! file_exists( $pic ) )
  33. {
  34.  getFic( $pic );
  35. }
  36. }
  37. ?>


 
Testé et approuvé !
Jolies photos ! ! !

je viens de tester,ya bien les images qui se créé mais j'arrive pas a les lire :??: comme si elle etait corompu

Reply

Marsh Posté le 01-02-2003 à 18:52:42    

C'est certainement l'histoire de beleg, si tu le peux, teste sur un serveur Unix.

Reply

Marsh Posté le 01-02-2003 à 18:52:42   

Reply

Marsh Posté le 01-02-2003 à 19:04:11    

_Raynor_ a écrit :

C'est certainement l'histoire de beleg, si tu le peux, teste sur un serveur Unix.

ca marche :jap:

Reply

Marsh Posté le 01-02-2003 à 19:22:57    

script toujours buggé, voir mon post précédent

Reply

Marsh Posté le 01-02-2003 à 20:04:58    

++Taz, D'accord avec toi, mais çà marche quand même !
 
_Raynor_, ja recherche de JFIF, c'est parce-que le serveur revoie une réponse du genre :
 

Code :
  1. HTTP/1.0 200 OK
  2. Connection: close
  3. Server: Microsoft-IIS/5.0
  4. IISExport: This web site was exported using IIS Export v3.0
  5. Date: Sat, 01 Feb 2003 18:46:32 GMT
  6. Content-Type: image/jpeg
  7. Accept-Ranges: bytes
  8. Last-Modified: Tue, 18 Jun 2002 12:19:22 GMT
  9. ETag: "0819a60c216c21:a52"
  10. Content-Length: 54676
  11. Via: 1.0 cacheflow2-emap


Les données (l'image en l'occurence) se trouvent à la suite.
 
En fait ce qu'il faudrait faire pour être vraiement correct, c'est de commencer par vérifier que le serveur renvoie une réponse OK :
HTTP/1.0 200 OK
 
Ensuite, il faut vérifier le Content-Type qui permet de savoir ce qu'on va recevoir :
Content-Type: image/jpeg
 
C'est bien une image jpeg !
 
Enfin, le serveur donne la longueur en octet :
Content-Length: 54676
 
Donc ce qu'il faut faire, c'est prendre les 54676 derniers octets du buffer et les écrire dans un fichier.
 
Voilà !
 
J'ai utilisé l'astuce de la recherche de la chaîne 'JFIF' pour faire simple.


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 02-02-2003 à 18:21:29    

jai ecrit ca perso :
 

Code :
  1. $size = 100000;
  2. $fp = fopen("http://www.fhm.com/girls/100sexiest/results/img/large/9.jpg","rb" ); //lecture du fichier
  3. $contenu = fread($fp,$size); // lecture  
  4. fclose($fp);
  5.  
  6. if($fp2 = fopen("test_9.jpg","wb" )) // ouverture du fichier en écriture
  7.    {
  8.       fwrite($fp2, $contenu); // on écrit dans le fichier
  9.       fclose($fp2);
  10.    }
  11.   else // L'ouverture a échouée
  12.    {
  13.       echo "Ouverture du fichier impossible";
  14.       exit();
  15.    }

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed