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
Dzięki! Będę próbować tego i sprawdzić, czy to działa. – David
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
Czy podczas zapisywania obrazu jest jakieś ograniczenie rozmiaru pliku? Czy ograniczenie przesyłania plików w konfiguracji PHP wpływa na to? – Foreever