2011-06-25 13 views
32

Potrzebuję zapisać obraz z adresu URL przy użyciu CURL i zapisać go w folderze na moim serwerze. Walczyłem z tym kodem bezskutecznie. Idealnie chciałbym pobrać obrazek i zapisać go jako "photo1" lub coś podobnego. Wsparcie!Zapisywanie obrazu z adresu URL z kodem PHP

function GetImageFromUrl($link) 

    { 

    $ch = curl_init(); 

    curl_setopt($ch, CURLOPT_POST, 0); 

    curl_setopt($ch,CURLOPT_URL,$link); 

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

    $result=curl_exec($ch); 

    curl_close($ch); 

    return $result; 

    } 

    $sourcecode = GetImageFromUrl($iticon); 

    $savefile = fopen(' /img/uploads/' . $iconfilename, 'w'); 
    fwrite($savefile, $sourcecode); 
    fclose($savefile); 

Odpowiedz

78

spróbuj tego:

function grab_image($url,$saveto){ 
    $ch = curl_init ($url); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_BINARYTRANSFER,1); 
    $raw=curl_exec($ch); 
    curl_close ($ch); 
    if(file_exists($saveto)){ 
     unlink($saveto); 
    } 
    $fp = fopen($saveto,'x'); 
    fwrite($fp, $raw); 
    fclose($fp); 
} 

i upewnić się, że w php.ini allow_url_fopen jest umożliwienie

+0

Dzięki! Będę próbować tego i sprawdzić, czy to działa. – David

+11

Należy pamiętać, że dobrze zakodowane strony internetowe będą szukały klienta użytkownika. Każda przeglądarka, tablet lub telefon zawsze ma klienta użytkownika! Jeśli nadal nie możesz uzyskać obrazu, najprawdopodobniej z powodu wykrycia agenta użytkownika, dodaj to ... 'curl_setopt ($ ch, CURLOPT_USERAGENT, 'MyImage Collector + http: //www.twojadomena_domeny/mybot.html'); 'lub podróbka prawdziwego' curl_setopt ($ ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv: 1.8.1.13) Gecko/20080311 Firefox/2.0.0.13'); ' – bbullis

+0

Czy podczas zapisywania obrazu jest jakieś ograniczenie rozmiaru pliku? Czy ograniczenie przesyłania plików w konfiguracji PHP wpływa na to? – Foreever

21

Option # 1

Zamiast zbieranie danych binarnych/RAW do zmienna, a następnie pisanie, można użyć opcji CURLOPT_FILE, aby bezpośrednio wyświetlić plik do curl do pobrania.

Oto funkcja:

// takes URL of image and Path for the image as parameter 
function download_image1($image_url, $image_file){ 
    $fp = fopen ($image_file, 'w+');    // open file handle 

    $ch = curl_init($image_url); 
    // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // enable if you want 
    curl_setopt($ch, CURLOPT_FILE, $fp);   // output to file 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 1000);  // some large value to allow curl to run for a long time 
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0'); 
    // curl_setopt($ch, CURLOPT_VERBOSE, true); // Enable this line to see debug prints 
    curl_exec($ch); 

    curl_close($ch);        // closing curl handle 
    fclose($fp);         // closing file handle 
} 

A oto jak należy to nazwać:

// test the download function 
download_image1("http://www.gravatar.com/avatar/10773ae6687b55736e171c038b4228d2", "local_image1.jpg"); 

Opcja nr 2

Teraz Jeśli chcesz pobrać bardzo duży plik, powyższa funkcja może nie być przydatna. Możesz użyć poniższej funkcji tym razem do obsługi dużego pliku. Możesz także wydrukować postęp (w formacie % lub w dowolnym innym formacie), jeśli chcesz. Poniższa funkcja jest realizowana za pomocą funkcji callback, która zapisuje fragment danych w pliku do postępu pobierania.

// takes URL of image and Path for the image as parameter 
function download_image2($image_url){ 
    $ch = curl_init($image_url); 
    // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // enable if you want 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 1000);  // some large value to allow curl to run for a long time 
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0'); 
    curl_setopt($ch, CURLOPT_WRITEFUNCTION, "curl_callback"); 
    // curl_setopt($ch, CURLOPT_VERBOSE, true); // Enable this line to see debug prints 
    curl_exec($ch); 

    curl_close($ch);        // closing curl handle 
} 

/** callback function for curl */ 
function curl_callback($ch, $bytes){ 
    global $fp; 
    $len = fwrite($fp, $bytes); 
    // if you want, you can use any progress printing here 
    return $len; 
} 

A oto jak nazwać tę funkcję:

// test the download function 
$image_file = "local_image2.jpg"; 
$fp = fopen ($image_file, 'w+');    // open file handle 
download_image2("http://www.gravatar.com/avatar/10773ae6687b55736e171c038b4228d2"); 
fclose($fp);         // closing file handle 
1

Ulepszona wersja Komang odpowiedzi (dodaj Referer i agenta użytkownika, należy sprawdzić, czy można zapisać pliku) zwraca wartość true, jeśli jest ok, false, jeśli wystąpił błąd:

public function downloadImage($url,$filename){ 
    if(file_exists($filename)){ 
     @unlink($filename); 
    } 
    $fp = fopen($filename,'w'); 
    if($fp){ 
     $ch = curl_init ($url); 
     curl_setopt($ch, CURLOPT_HEADER, 0); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
     curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); 
     $result = parse_url($url); 
     curl_setopt($ch, CURLOPT_REFERER, $result['scheme'].'://'.$result['host']); 
     curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0'); 
     $raw=curl_exec($ch); 
     curl_close ($ch); 
     if($raw){ 
      fwrite($fp, $raw); 
     } 
     fclose($fp); 
     if(!$raw){ 
      @unlink($filename); 
      return false; 
     } 
     return true; 
    } 
    return false; 
} 
+1

'CURLOPT_RETURNTRANSFER' wczytuje cały plik do zmiennej php. Jest wolniejszy i może pękać na dużych plikach. Zamiast tego przeprowadź wskaźnik pliku za pomocą 'CURLOPT_FILE'. – Walf

1

To jest najprostsze narzędzie.

function downloadFile($url, $path) 
{ 
    $newfname = $path; 
    $file = fopen($url, 'rb'); 
    if ($file) { 
     $newf = fopen($newfname, 'wb'); 
     if ($newf) { 
      while (!feof($file)) { 
       fwrite($newf, fread($file, 1024 * 8), 1024 * 8); 
      } 
     } 
    } 
    if ($file) { 
     fclose($file); 
    } 
    if ($newf) { 
     fclose($newf); 
    } 
} 
Powiązane problemy