martes, 5 de enero de 2016

Descargando ficheros desde una web con PHP

 
En este artículo mostraré con un ejemplo muy sencillo cómo copiar un fichero desde un sitio hacia otro, es decir, tenemos un fichero en una dirección http://sitio_externo/path/file.ext y queremos compartirlo en nuestro sitio http://mi_sitio/downloads/file.ext, o sencillamente queremos copiarlo hacia nuestro sitio servidor no se desee publicar.
Partimos de que el código PHP se ejecuta en nuestro sitio “mi_sitio”, por lo que tendríamos que descargar el fichero desde la web externa y copiarlo hacia la carpeta downloads en la raíz de nuestro sitio.
Para esto no copiaremos el fichero completamente, sino que utilizaremos las funciones de PHP de trabajo con ficheros (abrir ficheros, crear ficheros, copiar con fwrite…). Veamos el siguiente código:
   1: //capturar fuente por input o por cualquier vía, ejemplo http://sitio_externo/path/file.ext

   2: $http_path = …; 

   3:  

   4: //carpeta destino en nuestro servidor

   5: $upload_path = './downloads/';

   6:  

   7: //estableciendo un timeout límite para copiar

   8: set_time_limit (24 * 60 * 60);

   9:  

  10: //fichero destino incluyendo el path

  11: $newfname = $upload_path.basename($http_path);

  12:  

  13: //si se puede abrir el fichero fuente en modo lectura, se copia el contenido al fichero destino en modo escritura, por pedazos

  14: $source_file = fopen ($http_path, "rb");

  15: if ($file)

  16: {

  17:     $target_file = fopen ($newfname, "wb");

  18:  

  19:     if ($target_file)

  20:     {

  21:         while(!feof($source_file))

  22:             fwrite($target_file, fread($file, 1024 * 8 ), 1024 * 8 );

  23:          }

  24:      }

  25:  

  26: if ($source_file) fclose($source_file);

  27: if ($target_file) fclose($target_file);
Este método permite pasar el contenido de un fichero al otro por pedazos, lo que garantiza que no haya un límite de tamaño por el servidor. El límite de tiempo lo ponemos por seguridad.
Espero sea de utilidad este artículo.



{ Leer Más }


IconIconIcon