Descargar imagenes externas con PHP y cURL

Iniciado por Xt3mP, Abril 20, 2012, 02:45:22 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Abril 20, 2012, 02:45:22 AM Ultima modificación: Octubre 25, 2013, 11:37:15 PM por Expermicid
A veces nos vemos en la necesidad de utilizar imágenes externas pero por x  o por y motivos es imposible emplearlas en nuestros sitios web ya que la seguridad o la configuración de donde esta alojada la imagen ha desactivado la accesibilidad mediante el archivo .htaccess (generalmente) o porque el hosting en cuestión a veces no esta en "la nube" haciendo que nuestra página quede con un mal terminado ya que dependemos de imagenes externas (válgame la redundancia).

Entonces, lo más coherente sería descargar las imagenes para no depender de páginas externas que como ya expliqué anteriormente, algún día sin previo aviso pueden dejarnos tirados; y para ello utilizarémos el lenguaje PHP y cURL (librería para trabajar con servidores):

Código: php
<?php
/*
* Descargar imagenes externas con PHP y cURL
* Xt3mP
* [email protected]
*/
function descargarImagen($urlImagen, $target, $directorioBase)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $urlImagen);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $imagen = curl_exec($ch);
    curl_close($ch);
    $archivo = @fopen($directorioBase.$target, 'w');
    if($archivo)
    {
        echo 'La imagen '.basename($urlImagen).' ha sido descargada a '.$directorioBase.$target;
        @fwrite($archivo, $imagen);
        @fclose($archivo);
    }else{
        echo 'La imagen '.basename($urlImagen).' no se ha sido podido descargar';
    }
}
descargarImagen('http://xt3mp.mx/wp-content/themes/Polished/images/logo.png', 'miimagen.png', './galeria/');
?>


Lo que hacemos príncipalmente es iniciar una sesión de cURL y se la asignamos a la variable ch, después agregamos la configuración:

  • CURLOPT_URL: Dirección URL en cuestión.
  • CURLOPT_HEADER: Header en cuestión (lo cambiamos a false ya que viene true por default).
  • CURLOPT_RETURNTRANSFER: Devolvemos el resultado en string (lo cambiamos a true ya que viene false por default).
    Al final, le asignamos a la variable imagen el resultado de la petición cURL para posteriormente abrir la nueva imagen tomando en cuenta los parámetros que le pasamos a la función descargarImagen:

  • urlImagen: URL de la imagen en cuestión.
  • target: Nombre de imagen.
  • directorioBase: Directorio donde se guardará la imagen en cuestión.

    Luego de esto, el script mostrará un mensaje de success o de failure, según sea el caso. Esta función se deberá hacer manual para cada cada imagen que deseemos descargar por lo que me tome la libertad de hacer una función un poco más compleja que te permite descargar imágenes juntas con el nombre original o el asignado:

    Código: php
    <?php
    /*
    * Descargar imagenes externas con PHP y cURL
    * Xt3mP
    * [email protected]
    */
    function descargarImagen($urlImagenes, $noRepetir = true, $directorioBase, $prefijo = null)
    {
        foreach($urlImagenes as $id => $urlImagen)
        {
            $counter = 1;
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $urlImagen);
            curl_setopt($ch, CURLOPT_HEADER, 0);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            $imagen = curl_exec($ch);
            curl_close($ch);
            $nombreDearchivo = $prefijo.basename($urlImagen);
            if($noRepetir === true && @file_exists($directorioBase.$nombreDearchivo))
            {
                echo 'La imagen '.basename($urlImagen).' ya existe en '.$directorioBase.$nombreDearchivo.'<br />';
            }else{
                $infoDearchivo = pathinfo($urlImagen);
                while(@file_exists($directorioBase.$nombreDearchivo))
                {
                    $nombreDearchivo = $prefijo.$infoDearchivo['filename'].$counter.'.'.$infoDearchivo['extension'];
                    $counter++;
                }
                $archivo = @fopen($directorioBase.$nombreDearchivo, 'w');
                if($archivo)
                {
                    echo 'La imagen '.basename($urlImagen).' ha sido descargada a '.$directorioBase.$nombreDearchivo.'<br />';
                    @fwrite($archivo, $imagen);
                    @fclose($archivo);
                }else{
                    echo 'La imagen '.basename($urlImagen).' no se ha sido podido descargar.<br />';
                }
            }
        }
    }
    $urlImagenes = array(
                    'http://xt3mp.mx/wp-content/themes/Polished/images/logo.png',
                    'http://xt3mp.mx/wp-content/themes/Polished/images/logo.png',
                    'http://xt3mp.mx/wp-content/themes/Polished/images/logo.png',
                    'http://xt3mp.mx/wp-content/themes/Polished/images/logo.png'
    );
    descargarImagen($urlImagenes, true, './galeria/', 'xt3mp_');
    ?>


    En este caso recibimos 4 (cuatro) parámetros:

  • urlImagenes: Contiene las direcciones de las imagenes mediante un array.
  • noRepetir: Viene en true determinadamente; cambiarlo a false si se requiere que se guarden las imagenes aunque ya existan pero con diferente nombre (ej: foto1.png, foto2.png, foto3.png, fotox.png).
  • directorioBase: Directorio donde se guardará la imagen en cuestión.
  • prefijo: Prefijo para cada imagen (ej: xt3mp_foto1.png); no es obligatorio (dejarlo vacío si no se requiere).
    Y bueno, con esto ya podrían descargar cómodamente sus imágenes externas y guardarlas en la carpeta que mejor lo crean conveniente.
Cada vez que me das Karma me motivas