Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Kopiowanie plików graficznych i fsockopen
Forum PHP.pl > Forum > PHP
intol
Czy ktoś mógłby przytoczyć fragment kodu, który po podaniu linku (np. www.onet.pl/grafika.jpg) otwiera połączenie za pomocą fsockopen z serwerem, i kopiuje wskazany w linku plik do własnego katalogu?

Z góry dziękuję za pomoc.
dr_bonzo
a nie latwiej za pomoca file_get_contents i file_put_contents?
intol
Niestety nie, ponieważ serwer ma wyłączoną dyrektywę konfiguracyjnę fopen wrappers, co uniemożliwia wpisanie np. w fopen adresu rozpoczynającego się od http://...
tiraeth
jeżeli chodzi o obrazki to wystarczy
imagecreatefromjpeg
imagecreatetruecolor
imagecopyresampled
imagejpeg


smile.gif
dr_bonzo
Bez pelnej obslugi bledow i wyrazen regularnych
  1. <?php
  2. $iError = 0;
  3. $sError_msg = '';
  4. if ( ( $handle = fsockopen( '127.0.0.1', 80, $iError, $sError_msg ) ) === FALSE )
  5. {
  6. print( &#092;"ERROR ( $iError ): $sError_msg<br />n\" );
  7. die();
  8. }
  9.  
  10. $command = &#092;"GET /sciezka/obrazek_zrodlowy.png HTTP/1.1nHost: 127.0.0.1nn\";
  11. // na koncu MUSZA byc 2 x n
  12.  
  13. if ( fwrite( $handle, $command ) === FALSE )
  14. {
  15. print( &#092;"Write ERROR<br />n\" );
  16. }
  17.  
  18. $data = '';
  19.  
  20. while ( feof( $handle ) === FALSE )
  21. {
  22. $data .= fread( $handle, 8192 );
  23. }
  24.  
  25. // znajdz dlugosc pliku (w bajtach) w zmiennej $data, [Content-Length: xxxxx]
  26. // przydadza sie wyrazenia regularne, z ktorymi u mnie kiepsko biggrin.gif
  27. $dlugosc_pliku = ...
  28.  
  29. // i wyciągnij z $data ostatnie xxxx bajtow -- to bedzie obrazek
  30. $obraz = substr( $data, strlen( $data ) - $dlugosc_pliku, $dlugosc_pliku );
  31.  
  32. // zapisz obraz
  33. file_put_contents( 'obraz.png', $obraz );
  34. ?>
intol
Uzupełniłem kod, o to o czym pisałeś, jednak skrypt ciągle nie pobiera całego obrazka, tylko 42 pierwsze bity... (zresztą tyle wynosi Content-Length zwracanych przez serwer danych). Może zapytanie dla serwera jest złe?

  1. <?php
  2. $iError = 0;
  3. $sError_msg = '';
  4.  
  5.  
  6. $file= 'http://localhost/banner.gif';
  7.  
  8.  
  9. $parsed_url=parse_url($file);
  10. if($parsed_url[&#092;"port\"]=='') $parsed_url[\"port\"]=80;
  11.  
  12.  
  13. if ( ( $handle = fsockopen( $parsed_url[&#092;"host\"], $parsed_url[\"port\"], $iError, $sError_msg ) ) === FALSE )
  14. {
  15. print( &#092;"ERROR ( $iError ): $sError_msg<br />n\" );
  16. die();
  17. }
  18.  
  19. $command = &#092;"GET /{$parsed_url[\"path\"]} HTTP/1.1nHost: {$parsed_url[\"host\"]}nn\";
  20. #$command = \"GET /banner.gif HTTP/1.1nHost: 127.0.0.1nn\"; << z tym tesz nie działa...
  21.  
  22. // na koncu MUSZA byc 2 x n
  23.  
  24. if ( fwrite( $handle, $command ) === FALSE )
  25. {
  26. print( &#092;"Write ERROR<br />n\" );
  27. }
  28.  
  29. $data = '';
  30.  
  31. while ( feof( $handle ) === FALSE )
  32. {
  33. $data .= fread( $handle, 8192 );
  34. }
  35.  
  36. // znajdz dlugosc pliku (w bajtach) w zmiennej $data, [Content-Length: xxxxx]
  37. // przydadza sie wyrazenia regularne, z ktorymi u mnie kiepsko biggrin.gif
  38. if (!preg_match('#Content-Length:([0-9]+)[^ /][s]+#i', $data, $file_data1) || !preg_match('#Content-Type: image/[x-]*([a-z]+)[s]+#i', $data, $file_data2))
  39. $dlugosc_pliku = $file_data1[1];
  40. echo $dlugosc_pliku;
  41.  
  42. // i wyciągnij z $data ostatnie xxxx bajtow -- to bedzie obrazek
  43. $obraz = substr( $data, strlen( $data ) - $dlugosc_pliku - 1, $dlugosc_pliku );
  44.  
  45. // zapisz obraz
  46.  
  47. $plik = fopen (&#092;"plik.gif\", \"wb\");
  48. fputs ($plik, $obraz);
  49. fclose ($plik);
  50.  
  51. ?>
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.