Inicio arrow Notas y Artículos arrow Descargas con PHP
Menú Principal
Iniciar Sesión





¿Recuperar?

Descarga de Archivos con PHP

PDF Imprimir Enviar por email
Escrito por Ricardo Lejovitzky   
Páginas:
Descarga de Archivos con PHP
El Script
Cuando en nuestro Sitio Web implementamos un repositorio de archivos disponibles para descarga, a veces surge la necesidad de ejecutar ciertas tareas antes de enviar cada archivo a destino.

Ejemplo de tareas comunes cuando se opera con archivos para descarga:

  • Verificar que la solicitud del archivo parte de una pagina de nuestro servidor o de lo contrario rechazar la transferencia. Esto suele hacerse para evitar los "hot-links" y conservar ancho de banda.
  • Excluir a un sitio particular que linkea nuestros archivos, a determinados robots, IPs, etc.
  • Actualizar contadores de descarga, un Log con los detalles de cada transferencia y otras estadísticas.
  • Enviar un archivo modificado según las características de la solicitud.
  • Enviar código fuente evitando que se ejecute en el servidor.
Un modo de resolver este problema es usar un script que, luego de efectuar estos controles del caso, redirecciona a la ubicación final del archivo.

Este método nos presenta varios inconvenientes: No es compatible con todos los exploradores, no sirve para enviar fuentes de un script, requiere de una redirección, lo que endentece el inicio de la transferencia y la ubicación del archivo final siempre es delatada.

En este tutorial, implementamos un repositorio de archivos basado en script PHP:

Al llegar la solicitud del archivo, por ejemplo "http://files.misitio.com/programa.zip", el servidor verificará si el archivo solicitado se encuentra efectivamente en la estructura de archivos del sitio. Si el archivo no existe, verificará si existe en el repositorio de archivos. Solo si se dan estas dos condiciones (no existencia en el Sitio Web y existencia en el repositorio), ejecutará nuestro script para que desde ahí se envíe el archivo en forma totalmente transparente al visitante, previa actualización de un Log detallando la transferencia. En cualquier otro caso procesará la solicitud en forma normal.

Además del soporte PHP, se requiere apache y mod_rewrite. En próximas ediciones incluiremos un ejemplo para IIS.

Preparación del Servidor

Crear un Subdominio destinado al repositorio

Por ejemplo: "files.misitio.com".

Instalar el repositorio en un subdominio dedicado exclusivamente a este fin es la opción más conveniente y elegante, aunque también puede crearse un subdirectorio en el sitio principal.

Crear la ubicación física para los archivos

Lo mas conveniente es usar un directorio que se encuentre fuera del Sitio Web, Por ejemplo si el sitio se encuentra en "/home/usuario/public_html", podemos crear el directorio en "/home/usuario/archivos".

Si no es posible crear el directorio fuera del sitio, se puede crear un subdirectorio con un nombre difícil de intuir: "/home/usuario/public_html/xyz" por ejemplo.

Crear o Modificar .htaccess

Luego de crear el directorio, crear o modificar el archivo .htaccess ubicado (o a crearse) en la raíz del subdominio o directorio destinado al repositorio: Por ejemplo "/home/usuario/public_html".

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

 
# Agregamos está línea para evitar que se puedan explorar los
# directorios del servidor, en especial si la ubicación física
# de los archivos se encuentra dentro de la estructura del Sitio
# Web.
 
Options All -Indexes
 
# Requerido por mod_rewrite:
 
Options +FollowSymLinks
RewriteEngine On
 
# Verifica si el archivo solicitado existe dentro del Sitio Web.
# En este caso se procesará la consulta normalmente.
 
RewriteCond %{REQUEST_FILENAME} !-f
 
# Si el archivo no existe en el sitio, verificará si existe en
# el directorio del repositorio.
 
# En este ejemplo el directorio archivos se encuentra paralelo
# al directorio del sitio, por ejemplo en /home/usuario/archivos.
 
RewriteCond %{DOCUMENT_ROOT}/../archivos%{REQUEST_URI} -f
 
# Comentar la línea anterior y quitar comentario a la siguiente
# si el directorio se encuentra dentro del sitio
# (/home/usuario/public_html/xyz).
 
# RewriteCond %{DOCUMENT_ROOT}/xyz%{REQUEST_URI} -f
 
# Por supuesto, también habrá que cambiar archivos o xyz por
# el nombre real. 
 
# Si la consulta no corresponde a un archivo existente pero
# sí corresponde a un archivo ubicado en el repositorio, se
# ejecuta el script.
 
RewriteRule (.*) descargas.php
 


Modificado el ( jueves, 10 de mayo de 2007 )
 
El Tiempo...
Cotizaciones
Dólares EstadounidensesCompra
u$s
Venta
u$s
Euros0.740.75
Pesos Argentinos8.128.21
Reales2.202.23
Pesos Mexicanos12.8713.01
Pesos Chilenos562.37568.57
Pesos Bolivianos6.876.95

Actualizadas el:
22 de julio de 2014
a las 20:15 Hs.
Visitantes...
Hasta ahora 1431107

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