Inicio arrow Notas y Artículos arrow Descargas con PHP
Menú Principal

Descarga de Archivos con PHP

PDF Imprimir Enviar por email
Escrito por Ricardo Lejovitzky   
Páginas:
Descarga de Archivos con PHP
El Script

El Script

Para descargar .htaccess y descargas.php bajar este archivo.

Solo es requerido modificar las primeras 3 líneas ($logFile, $downPath y timezone).

El resto de las líneas se pueden modificar para agregarle alguna funcionalidad adicional como la conexión a base de datos, efectuar validaciones o para modificar el comportamiento del Log.

Luego de la modificación de descargas.php, lo guardamos y copiamos al mismo directorio en que se encuentra .htaccess.

 
<?php
 
// Modificar: Ubicación del archivo Log donde se guardaran
// los detalles de transferencia.
 
$logFile='/home/usuario/logs/archivos.txt';
 
// Modificar: Ubicación del directorio donde se encuentran
// físicamente los archivos.
 
$downPath='/home/usuario/archivos';
 
// Modificar: Ajusta las fechas en Log a la zona especificada.
 
date_default_timezone_set('America/Argentina/Buenos_Aires');
 
// Inicio del Script: Para calcular la duración total
// de la transferencia.
 
$inicio=time();
 
// Obtiene un parametro o retorna cadena vacia.
 
function getParam(&$arr,$name)
{
    if(isset($arr[$name]))
        return $arr[$name];
    return '';
}
 
// Soporte de Cache: Retorna true si el recurso no fue modificado.
 
function testCache($md5,$gmt_mtime)
{
  if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
      && $_SERVER['HTTP_IF_MODIFIED_SINCE'] == $gmt_mtime)
      return true;
    if (isset($_SERVER['HTTP_IF_NONE_MATCH'])
     && str_replace('"', '',
stripslashes($_SERVER['HTTP_IF_NONE_MATCH'])) == $md5)
            return true;
        return false;
}
 
// Escribe una entrada en el Log.
// Este script solo guarda una entrada al salir
// por lo que no es necesario cerrar el handle.
 
function writeLog($texto)
{
 global $logFile;
    $hora=strftime('[%d-%b-%Y %T]');
  if ($handle = @fopen($logFile, 'ab'))
     fwrite($handle,$hora . ' ' . $texto);
}
 
// Desactiva magic quotes.
 
set_magic_quotes_runtime(0);
 
// Agente de usuario (explorador).
 
$agente=getParam($_SERVER,'HTTP_USER_AGENT');
 
// Referencia (Página web de procedencia).
 
$referer=getParam($_SERVER,'HTTP_REFERER');
 
// IP del visitante.
 
$ip=$_SERVER['REMOTE_ADDR'];
 
// Obtiene el nombre de archivo y verifica su existencia.
// Si el archivo no se encuentra, envia un error 404
// y reporta en Log.
 
$file=getParam($_SERVER,'REQUEST_URI');
$displayname=substr($file,1);
$file=$downPath . $file;
if(!$displayname || !file_exists($file) || !($len=filesize($file)))
{
 if($displayname)
        writeLog("$displayname:\nAgente: $agente".
"\nReferencia: $referer\nIP $ip - ".
"RESPUESTA 404 (No encontrado).\n\n");
 header('HTTP/1.0 404 No encontrado');
 exit;
}
 
 
/*
 
Aquí podemos efectuar validaciones previas a enviar el archivo.
 
Por ejemplo: Podemos verificar si la consulta proviene o no
de nuestro Sitio Web ($referer), si proviene de algún spider
o robot ($agente) o si la IP cliente se encuentra en una
lista de exclusión ($ip).
 
También aquí podemos descartar algún archivo o extensión del
repositorio que no debe enviarse. Recordemos que si en el
repositorio de archivos hubiera algún script, este será
enviado textualmente sin ejecutar.
 
Si para rechazar la transferencia basta con agregar estas líneas:
 
writeLog("$displayname:\nAgente: $agente\nReferencia: $referer".
"\nIP $ip - $len bytes - RESPUESTA 403 (No autorizado).\n\n");
header('HTTP/1.1 403 No autorizado');
exit;
 
*/
 
// Fecha de archivo (para la validación de Cache y para enviar
// en encabezado).
 
$mtime=filemtime($file);
$gmt_mtime = gmdate('D, d M Y H:i:s', $mtime).' GMT';
 
// Seudo ETag: Genera un Hash MD5 del nombre de archivo,
// tamaño y fecha.
 
$md5=md5($file.$len.$mtime);
 
// Si el cliente solicita verificar el cache y la validacion
// es positiva, enviamos una respuesta 304 y salimos del script.
 
if(testCache($md5,$gmt_mtime))
{
       writeLog("$displayname:\nAgente: $agente".
"\nReferencia: $referer\nIP $ip - $len bytes - ".
"RESPUESTA 304 (No modificado).\n\n");
        header('HTTP/1.1 304 No modificado');
     exit;
}
 
// Intento de apertura del archivo.
// Si no podemos abrirlo enviamos un error 500.
 
$fp = @fopen($file, 'rb');
if(!$fp)
{
   writeLog("$displayname:\nAgente: $agente\nReferencia: $referer".
"\nIP $ip - $len bytes - RESPUESTA 500 (Error de servidor).\n\n");
 header( 'HTTP/1.1 500 Error de servidor' );
   exit;
}
 
// Content-Type de acuerdo a la extensión.
 
$ext=strrpos($displayname,'.');
if($ext===false)
   $ctype='application/force-download';
else
{
 switch(strtolower(substr($displayname,++$ext))) {
           case 'ez': $ctype='application/andrew-inset'; break;
            case 'atom': $ctype='application/atom+xml'; break;
          case 'hqx': $ctype='application/mac-binhex40'; break;
           case 'cpt': $ctype='application/mac-compactpro'; break;
         case 'mathml': $ctype='application/mathml+xml'; break;
          case 'doc': $ctype='application/msword'; break;
         case 'bin':
           case 'class':
         case 'dll':
           case 'dmg':
           case 'dms':
           case 'exe':
           case 'lha':
           case 'lzh':
           case 'rar':
           case 'so': $ctype='application/octet-stream'; break;
            case 'oda': $ctype='application/oda'; break;
            case 'ogg': $ctype='application/ogg'; break;
            case 'pdf': $ctype='application/pdf'; break;
            case 'ai':
            case 'eps':
           case 'ps': $ctype='application/postscript'; break;
          case 'rdf': $ctype='application/rdf+xml'; break;
            case 'smi':
           case 'smil': $ctype='application/smil'; break;
          case 'grxml': $ctype='application/srgs+xml'; break;
         case 'gram': $ctype='application/srgs'; break;
          case 'mif': $ctype='application/vnd.mif'; break;
            case 'xul': $ctype='application/vnd.mozilla.xul+xml'; break;
            case 'xls': $ctype='application/vnd.ms-excel'; break;
           case 'ppt': $ctype='application/vnd.ms-powerpoint'; break;
          case 'rm': $ctype='application/vnd.rn-realmedia'; break;
            case 'wbxml': $ctype='application/vnd.wap.wbxml'; break;
            case 'wmlc': $ctype='application/vnd.wap.wmlc'; break;
          case 'wmlsc': $ctype='application/vnd.wap.wmlscriptc'; break;
           case 'vxml': $ctype='application/voicexml+xml'; break;
          case 'bcpio': $ctype='application/x-bcpio'; break;
          case 'vcd': $ctype='application/x-cdlink'; break;
           case 'pgn': $ctype='application/x-chess-pgn'; break;
            case 'cpio': $ctype='application/x-cpio'; break;
            case 'csh': $ctype='application/x-csh'; break;
          case 'dcr':
           case 'dir':
           case 'dxr': $ctype='application/x-director'; break;
         case 'dvi': $ctype='application/x-dvi'; break;
          case 'spl': $ctype='application/x-futuresplash'; break;
         case 'gtar': $ctype='application/x-gtar'; break;
            case 'hdf': $ctype='application/x-hdf'; break;
          case 'phps': $ctype='application/x-httpd-php-source'; break;
            case 'php':
           case 'php3':
          case 'php4':
          case 'phtml': $ctype='application/x-httpd-php'; break;
          case 'js': $ctype='application/x-javascript'; break;
            case 'skd':
           case 'skm':
           case 'skp':
           case 'skt': $ctype='application/x-koan'; break;
         case 'latex': $ctype='application/x-latex'; break;
          case 'cdf':
           case 'nc': $ctype='application/x-netcdf'; break;
            case 'crl': $ctype='application/x-pkcs7-crl'; break;
            case 'shar': $ctype='application/x-shar'; break;
            case 'swf': $ctype='application/x-shockwave-flash'; break;
          case 'sh': $ctype='application/x-sh'; break;
            case 'sit': $ctype='application/x-stuffit'; break;
          case 'sv4cpio': $ctype='application/x-sv4cpio'; break;
          case 'sv4crc': $ctype='application/x-sv4crc'; break;
            case 'tar':
           case 'tgz': $ctype='application/x-tar'; break;
          case 'tcl': $ctype='application/x-tcl'; break;
          case 'texi':
          case 'texinfo': $ctype='application/x-texinfo'; break;
          case 'tex': $ctype='application/x-tex'; break;
          case 'man': $ctype='application/x-troff-man'; break;
            case 'me': $ctype='application/x-troff-me'; break;
          case 'ms': $ctype='application/x-troff-ms'; break;
          case 'roff':
          case 't':
         case 'tr': $ctype='application/x-troff'; break;
         case 'ustar': $ctype='application/x-ustar'; break;
          case 'src': $ctype='application/x-wais-source'; break;
          case 'crt': $ctype='application/x-x509-ca-cert'; break;
         case 'xht':
           case 'xhtml': $ctype='application/xhtml+xml'; break;
            case 'dtd': $ctype='application/xml-dtd'; break;
            case 'xml':
           case 'xsl': $ctype='application/xml'; break;
            case 'xslt': $ctype='application/xslt+xml'; break;
          case 'zip': $ctype='application/zip'; break;
            case 'au':
            case 'snd': $ctype='audio/basic'; break;
            case 'kar':
           case 'mid':
           case 'midi': $ctype='audio/midi'; break;
            case 'mp2':
           case 'mp3':
           case 'mpga': $ctype='audio/mpeg'; break;
            case 'aif':
           case 'aifc':
          case 'aiff': $ctype='audio/x-aiff'; break;
          case 'm3u': $ctype='audio/x-mpegurl'; break;
            case 'ra':
            case 'ram': $ctype='audio/x-pn-realaudio'; break;
           case 'wav': $ctype='audio/x-wav'; break;
            case 'pdb': $ctype='chemical/x-pdb'; break;
         case 'xyz': $ctype='chemical/x-xyz'; break;
         case 'bmp': $ctype='image/bmp'; break;
          case 'cgm': $ctype='image/cgm'; break;
          case 'gif': $ctype='image/gif'; break;
          case 'ief': $ctype='image/ief'; break;
          case 'jpe':
           case 'jpeg':
          case 'jpg': $ctype='image/jpeg'; break;
         case 'png': $ctype='image/png'; break;
          case 'svg': $ctype='image/svg+xml'; break;
          case 'tif':
           case 'tiff': $ctype='image/tiff'; break;
            case 'djv':
           case 'djvu': $ctype='image/vnd.djvu'; break;
            case 'wbmp': $ctype='image/vnd.wap.wbmp'; break;
            case 'ras': $ctype='image/x-cmu-raster'; break;
         case 'ico': $ctype='image/x-icon'; break;
           case 'pnm': $ctype='image/x-portable-anymap'; break;
            case 'pbm': $ctype='image/x-portable-bitmap'; break;
            case 'pgm': $ctype='image/x-portable-graymap'; break;
           case 'ppm': $ctype='image/x-portable-pixmap'; break;
            case 'rgb': $ctype='image/x-rgb'; break;
            case 'xbm': $ctype='image/x-xbitmap'; break;
            case 'xpm': $ctype='image/x-xpixmap'; break;
            case 'xwd': $ctype='image/x-xwindowdump'; break;
            case 'iges':
          case 'igs': $ctype='model/iges'; break;
         case 'mesh':
          case 'msh':
           case 'silo': $ctype='model/mesh'; break;
            case 'vrml':
          case 'wrl': $ctype='model/vrml'; break;
         case 'ics':
           case 'ifb': $ctype='text/calendar'; break;
          case 'css': $ctype='text/css'; break;
           case 'htm':
           case 'html':
          case 'shtml': $ctype='text/html'; break;
            case 'asc':
           case 'log':
           case 'txt': $ctype='text/plain'; break;
         case 'rtx': $ctype='text/richtext'; break;
          case 'rtf': $ctype='text/rtf'; break;
           case 'sgm':
           case 'sgml': $ctype='text/sgml'; break;
         case 'tsv': $ctype='text/tab-separated-values'; break;
          case 'wmls': $ctype='text/vnd.wap.wmlscript'; break;
            case 'wml': $ctype='text/vnd.wap.wml'; break;
           case 'etx': $ctype='text/x-setext'; break;
          case 'mpe':
           case 'mpeg':
          case 'mpg': $ctype='video/mpeg'; break;
         case 'mov':
           case 'qt': $ctype='video/quicktime'; break;
         case 'm4u':
           case 'mxu': $ctype='video/vnd.mpegurl'; break;
          case 'avi': $ctype='video/x-msvideo'; break;
            case 'movie': $ctype='video/x-sgi-movie'; break;
            case 'ice': $ctype='x-conference/x-cooltalk'; break;
        default: $ctype='application/force-download'; break;
  }
}
 
// Desactivamos el limite de tiempo del script antes de
// iniciar la transferencia.
 
@set_time_limit(0);
 
// Encabezados básicos, pueden agregarse otros
// como los relacionados al cache.
 
header('Last-Modified: '.$gmt_mtime);
header('ETag: "'.$md5.'"');
header('Content-Length: ' . $len);
header('Content-Type: ' . $ctype);
 
// Transferencia...
 
while(!feof($fp)) {
  echo fread($fp, 524288);
    flush();
}
 
// Solo se llega aquí si la transferencia fue finalizada.
 
$tiempo=time()-$inicio;
$bytesSeg=number_format(($tiempo?($len/$tiempo):$len)/1024,2,',','');
writeLog("$displayname:\nAgente: $agente".
"\nReferencia: $referer\nIP $ip - $len bytes - $tiempo segs. ".
"($bytesSeg KB/seg).\n\n");
?>
 


Modificado el ( jueves, 10 de mayo de 2007 )
 
Cotizaciones
Dólares EstadounidensesCompra
u$s
Venta
u$s
Euros0.880.88
Pesos Argentinos37.4537.87
Reales3.903.94
Pesos Mexicanos20.2020.43
Pesos Chilenos674.59682.03
Pesos Bolivianos6.906.99

Actualizadas el:
11 de diciembre de 2018
a las 04:15 Hs.
Visitantes...
Hasta ahora 1835837

Tu IP:
3.80.85.76 Estados Unidos
Suscripciones
Ricardo Lejovitzky - Copyright © 2002-2018 - Derechos Reservados | Tecnologías:  XHTML - CSS - PHP - MySql - Joomla - GeoIP - Flash