Ver Mensaje Individual
  #11 (permalink)  
Antiguo 09/02/2004, 20:42
Cluster
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
jcorba


La técnica pasa por dos puntos principales:
1) Que PHP sea el que acceda al archivo para enviarlo al navegador

2) Sistema de autentificación si lo requieres..

Del punto 1 .. necesitas leer el archivo sea cual sea su ubicación física: una base de datos en un campo tipo "binario" .. o el sistema de archivos del servidor.

Una ve leido necesitas enviarlo al cliente (navegador) .. vas a enviar esos datos que has leido, debes decirle al navegador que tipo de datos le estas enviando para que los interprete como corresponda .. ya sea que los abra (asocie a su lector caso de un .pdf .. un .doc .. o una .jpg, .gif ...) o bien los "fuerce" para descargar (independiente del formato MIME que sea el archivo que has leido y sus datos ..

Este control sobre el navegador lo haces con las cabeceras HTTP adecuadas tipo "content-type" y afines. Estas cabeceras HTTP las define el protocolo HTTP (no es própio de PHP). Con PHP "lanzas" esas cabeceras con la función header() ...

Existe un pequeño "problema" .. Dichas cabeceras HTTP, si bien son standards y lo define ese protocolo HTTP, algunos navegadores no las respetan o bien no las interpretan de la misma forma: ejemplo .. a uno le dices "tal cabecera = descargar" y lo entiende como "mostrar" .. Así que no te extrañe si un mismo código que puedas probar que use X cabeceras te funciona o se comporta de una manera en X navegador y en Y navegador (incluso versión de mismo fabricante) se comporta diferente. Ese es un problema que se suele solventar identificando el navegador que está conectado al script .. y a partir de ahí enviarle las cabeceras HTTP más adecuadas a ese determinado script (todo para mantener una compatibilidad "aparente").

Ejemplos de todo esto tienes en las FAQ's (una bastante completa con "opción resume" para que tu navegador o cliente de descargas pueda retomar la descarga si se perdió la conexión (esto es una propiedad más del protocolo HTTP ..)).

Sobre el tema de "donde" almacenar tus datos .. Si bien almacenarlos en una Base de datos en formato binario (en un campo de ese tipo en la BD) .. Para archivos grandes o en generar un total de bytes de esos archivos (peso) grande .. se puede hacer "pesado" para manejarlo por el motor de BD que uses. Mysql por ejemplo no es el mejor motor de BD para ese fin aunque su implementación es sencilla. Existen otros motores de BD que se manejan mejor con gran cantidad de datos como los que vas a generar si almacenas tus archivos en tu BD en formato binario.

La otra alternativa es sólo guardar en tu BD una referencia hacia donde está el archivo en tu sistema de archivos (ruta/nombre). Ese "dato" para la Base de datos es sólo una cadena de texto corriente (y tal vez de no más de 256 caracteres) así que .. es muchoooo más manejable para trabajar con esa BD y hacer consultas en general .. En el momento que se requiera ese archivo se "linkeará" al archivo que está ya en el sistema de archivos del servidor en esa ruta que guardas en ese campo de tu tabla (BD).

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.