Opción # 1
lugar de recoger los datos/primas binarias en una variable y luego escribir, puede usar la opción CURLOPT_FILE
para mostrar directamente un archivo al curl para la descarga.
Aquí es la función:
// 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
}
Y aquí es cómo se debe llamar:
// test the download function
download_image1("http://www.gravatar.com/avatar/10773ae6687b55736e171c038b4228d2", "local_image1.jpg");
Opción # 2
Ahora, Si desea descargar una archivo muy grande, esa función de arriba del caso puede no ser útil. Puede usar la función siguiente esta vez para manejar un archivo grande. Además, puede imprimir el progreso (en %
o en cualquier otro formato) si lo desea. La función siguiente se implementa utilizando una función callback
que escribe una porción de datos en el archivo en el progreso de la descarga.
// 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;
}
Y aquí es cómo llamar a esta función:
// 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
¡Gracias! Seguiré intentando esto y veré si eso funciona. – David
Tenga en cuenta que los sitios web bien codificados buscarán un agente de usuario. ¡Cada navegador, tableta o teléfono siempre tendrá un agente de usuario! Si aún no puede obtener una imagen, probablemente debido a la detección del agente de usuario, agregue esto ... 'curl_setopt ($ ch, CURLOPT_USERAGENT, 'MyImage Collector + http: //www.yourdomainname/mybot.html'); 'o parodia de uno real' 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
¿Hay alguna limitación de tamaño de archivo al guardar una imagen como esta? ¿La limitación de carga de archivos en la configuración PHP afecta esto? – Foreever