Descarga de ficheros HTTP desde campos tipo BINARY en Base de Datos
Realiza la descarga de ficheros HTTP almacenados como Binary o Blob
Cuando en una de nuestras aplicaciones web tenemos que manejar ficheros de subida y descarga, generalmente éstos son almacenados en el sistema de archivos del servidor local en forma de archivos en directorios anejos a la solución web. Sin embargo, nos podemos encontrar en ocasiones con aplicaciones ya existentes que disponen de archivos almacenados en base de datos, dentro de campos tipo OLE, BLOB o BINARY.
La forma de devolver al navegador el contenido de estos ficheros es a través del objeto Response del servidor de aplicaciones, al cual deberemos especificarle algunos parámetros para que el navegador pueda descargar correctamente cualquier tipo de archivos. No es trivial hacerlo a la primera pues las cabeceras del Response hay que establecerlas de forma completa. A continuación, presentamos dos fragmentos de código en PHP y C# que realizan esta operación.
PHP
<?php
// Especifica el tipo de descarga al navegador
header(‘Content-Description: File Transfer’);
// Indica el tipo de archivo a descargar
header(‘Content-Type: application/octet-stream’);
// Nombre del fichero, !sin espacios en blanco¡
header(‘Content-Disposition: attachment; filename=dibujo.dwg’);
// Tipo de transferencia
header(‘Content-Transfer-Encoding: binary’);
// Control de caché
header(‘Expires: 0’);
header(‘Cache-Control: must-revalidate, post-check=0, pre-check=0’);
header(‘Pragma: public’);
// Vaciado de los cachés y envío del contenido al navegador
ob_clean();
flush();
// $contenido contiene el stream del fichero a enviar al navegador
echo $contenido;
exit;
?>
// Limpiar buffer de response.
Response.Clear();
// Establece el tipo de archivo.
Response.ContentType = «application/octet-stream»;
// Indica el formato de descarga del fichero
Response.AddHeader(«Content-Disposition», «attachment;filename='» & filename.replace(» «,»-«) & «‘»);
// Envía los datos leídos de la base de datos al navegador
Response.BinaryWrite(data);
// Cierra el canal de envío.
Response.End();
Conclusiones
Está claro que almacenar en base de datos los ficheros tiene como ventaja las posibilidades de migración y la centralización del repositorio documental, a costa de unas mayores necesidades de espacio en el motor de base de datos así como un compromiso a la hora de manejar bases de datos de miles o millones de registros.
No comments yet.