Utilizar Curl para copiar una imagen de una web en nuestro disco duro

  • Por
  • 17 de enero de 2007
  • Valoración:
  • 5 Comentarios
  • Scripts en PHP
Vamos a ver un ejemplo de utilización de la librería CURL para copiar una imagen que está en una página web a nuestro disco duro.
Vamos a realizar un ejemplo complejo de utilización de PHP, en el que nos conectamos con un servidor web para recibir un archivo de imagen que está alojado en dicho servidor. Para especificar la imagen que queremos extraer utilizamos la URL y luego especificamos otra ruta dentro de nuestro disco duro, donde copiaremos la imagen que hemos recibido de dicha URL.

Yo he utilizado este código para facilitar la migración automática de un sitio web. El sitio web nuevo tenía una estructura distinta y por eso se tenían que recibir las imágenes para guardarlas en otros directorios. Con esta función, y otras similares, he podido extraer todas las imágenes del sitio web antiguo y colocarlas en los directorios correctos en el sitio web nuevo.

Como decía, vamos a utilizar CURL para realizar esta tarea. Seguro que existen otras maneras de llevarla a cabo, pero esta me ha parecido bastante práctica. Curl es una librería para trabajo y tratamiento de información en URLs, es decir, para hacer cosas con direcciones URL, como explorar el contenido que tienen, copiar el contenido a otros lugares, comprobar la existencia de una URL. He de admitir que no controlo mucho la librería Curl, pero podría decir que es bastante potente y compleja.

CURL se encuentra en PHP

Según la instalación que tengamos de PHP tendremos disponibles, o no, las funciones de la librería CURL. La mejor manera de saber si disponemos de Curl en nuestra instalación PHP es invocar una de sus funciones. Si nos muestra un error de función no existente, es que no tenemos posibilidad de usar Curl. El propio manual de PHP especifica qué debemos hacer para poder utilizar las librerías.

Para poder usar estas funciones, se debe compilar PHP añadiendo el parámetro --with-curl[=DIR], donde DIR apunta al directorio que contiene los directorios lib y include de la librería. En el directorio include, debe existir una carpeta llamada "curl" y que contiene los archivos easy.h y curl.h. Además, debe existir un archivo llamado libcurl.a en el directorio "lib". A partir de la versión de PHP 4.3.0 se puede configurar que PHP haga uso de CURL para el manejo de las conexiones con URLs, mediante la opción --with-curlwrappers.

Nota para los usuarios de plataformas Windows: Para activar este módulo en entornos Windows, se deben copiar los archivos libeay32.dll y ssleay32.dll que se encuentran en la carpeta DLL del directorio PHP/Win32 a la carpeta SYSTEM de Windows, que normalmente se encuentra en C:\WINNT\SYSTEM32 o C:\WINDOWS\SYSTEM.

No obstante, en mi ordenador local utilizo Easy PHP, que es un paquete que te instala el conjunto Apache-PHP-MySQL en tu sistema Windows, sin que tengas que hacer nada, ni aprender a configurar los distintos sistemas. Easy PHP no dispone por defecto de soporte para Curl, pero cambiando una línea del archivo de configuración de PHP (el archivo php.ini) podremos dar soporte a Curl. La línea en concreto es:

;extension=php_curl.dll

Esta línea en principio está comentada, por eso empieza por ";". Simplemente habrá que quitar el "punto y coma" para que EasyPHP disponga de soporte Curl. Aunque no utilizes EasyPHP prueba a descomentar esta línea, si es que no dispones de soporte para CURL.

Función para obtener una imagen de una URL determinada

Vamos a tratar ya el objetivo final del artículo, que es traerse una imagen alojada en una web a nuestro disco duro. Para ello hemos creado una función que recibe dos parámetros. El primero es la URL de la imagen que deseamos obtener y el segundo es el nombre del archivo que queremos generar en el disco duro, donde copiaremos la imagen. El nombre del archivo destino es relativo al documento, pudiendo indicar una ruta relativa, compuesta por varios directorios y un nombre de archivo.

function recibe_imagen ($url_origen,$archivo_destino){
$mi_curl = curl_init ($url_origen);
$fs_archivo = fopen ($archivo_destino, "w");
curl_setopt ($mi_curl, CURLOPT_FILE, $fs_archivo);
curl_setopt ($mi_curl, CURLOPT_HEADER, 0);
curl_exec ($mi_curl);
curl_close ($mi_curl);
fclose ($fs_archivo);
}


En esta función se da de alta una sesión CURL, con curl_init($url_origen), en donde pasamos la URL a la que deseamos acceder.

Luego utilizamos las funciones del sistema de archivos de PHP para crear un nuevo archivo en el disco duro del ordenador. Si nos fijamos, se indica el archivo destino y el parámetro "w" que quiere decir que la conexión con el archivo es para escritura.

Luego indicamos un par de opciones en la sesión CURL.

curl_setopt ($mi_curl, CURLOPT_FILE, $fs_archivo);
curl_setopt ($mi_curl, CURLOPT_HEADER, 0);

La más importante es la primera, en la que se indica el valor CURLOPT_FILE, donde se asigna el archivo en el que se va a guardar los datos de la URL. El parámetro $fs_archivo debe ser un recurso de tipo stream o flujo de datos. En este caso es el archivo destino, conectado con el sistema de archivos del servidor anteriormente en la misma función.

La segunda opción definida hace que el encabezamiento no se incluya en la salida.

Para continuar, ejecutamos la conexión CURL con curl_exec() y por último, se cierran tanto la conexión CURL como el archivo donde hemos guardado la imagen.

Conclusión

CURL es una librería muy potente. Esta es sólo una de las utilidades de la librería, que puede servir de ejemplo para entender el uso y dar pie a otras utilidades interesantes. Podría haberse complicado un poco el script simplemente comprobando que la URL indicada en el parámetro es correcta o realizando otro tipo de acciones de validación o tratamiento de la imagen recibida en la URL.

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Comentarios

Bruj0

23/1/2007
Hola, podria alguien indicar como seria para verificar que el archivo existe o que la ruta es correcta? gracias

newlinkarlos

18/2/2007
// check URL es valida
if (@fopen($nueva_url, "r"))
echo "URL válida";
else
echo "No existe esa URL.";

Juan Manuel

24/2/2009
Hola.

Tengo un servidor con 1and1.es no se si estas librerias las tengo intaladas me podrias ayudar un poco se lo agradeceria mucho, el pequeño codigo no me da ni error y no me hace nada.

Saludos.

nico

05/10/2009
Sirve para facebook?
Hola. Esta liberia sirve para extarer las imagenes de facebook?
Saludos y gracias.

Sandra

27/1/2010
Cambio de nombre ala hora de guardar la imagen
Que tal tengo una duda como seria si quisiera cambiarle el nombre a la hora de grabar el archivo es decir jalo de una url portada.jpg pero yo quiero que se grabe como portada20.jpg se puede???

Compartir