• 14 julio 2025
  • Enrique Flores
  • 0

Introducción

¿Alguna vez intentaste descargar un archivo desde Oracle APEX y terminaste complicándote con tipos MIME, headers o conversiones BLOB/CLOB?

Oracle APEX 24.2 simplifica este proceso con el poderoso procedimiento APEX_HTTP.DOWNLOAD. Esta utilidad te permite enviar archivos desde PL/SQL directamente al navegador, sin hacks, sin JavaScript, sin complicaciones.

En este artículo:

  • Te explico qué hace y cómo funciona APEX_HTTP.DOWNLOAD
  • Verás un ejemplo empresarial para descargar un PDF generado dinámicamente
  • Conocerás errores comunes y cómo evitarlos

Este artículo es útil para desarrolladores Oracle APEX, arquitectos y especialistas en backend que necesitan descargar archivos en sus apps sin depender de ORDS ni librerías externas.

Tabla de Contenido

  1. ¿Qué es APEX_HTTP.DOWNLOAD?
  2. Sintaxis y parámetros clave
  3. Ejemplo real: descarga de contrato PDF
  4. Consideraciones especiales (MIME, CLOB)
  5. Buenas prácticas
  6. Conclusión y recurso extra

1. ¿Qué es APEX_HTTP.DOWNLOAD?

Es un procedimiento del paquete APEX_HTTP que permite enviar directamente un archivo desde Oracle APEX al navegador del usuario.

Este procedimiento es ideal cuando necesitas entregar archivos generados dinámicamente o almacenados en BLOB/CLOB en la base de datos.

No necesitas ORDS, ni htp.p, ni owa_util.mime_header manuales.


2. Sintaxis y parámetros clave

 APEX_HTTP.DOWNLOAD( p_content_disposition IN VARCHAR2, p_mime_type IN VARCHAR2, p_content IN BLOB, p_filename IN VARCHAR2 DEFAULT NULL ); 
  • p_content_disposition: 'inline' o 'attachment'
  • p_mime_type: tipo MIME, ej. 'application/pdf'
  • p_content: el archivo en formato BLOB
  • p_filename: nombre opcional del archivo a descargar

3. Ejemplo real: descarga de contrato PDF

Supón que tienes una tabla CONTRATOS con archivos en formato BLOB:

 CREATE TABLE contratos ( id NUMBER PRIMARY KEY, cliente VARCHAR2(100), archivo_pdf BLOB, nombre_archivo VARCHAR2(255), mime_type VARCHAR2(100) ); 

Creamos una página APEX con botón de descarga y un proceso PL/SQL tipo “Submit”:

 DECLARE l_blob BLOB; l_mime VARCHAR2(100); l_nombre VARCHAR2(255); BEGIN SELECT archivo_pdf, mime_type, nombre_archivo INTO l_blob, l_mime, l_nombre FROM contratos WHERE id = :P1_ID_CONTRATO;
APEX_HTTP.DOWNLOAD (
p_content_disposition => 'attachment',
p_mime_type => l_mime,
p_content => l_blob,
p_filename => l_nombre
);
END;

Resultado: al presionar el botón, el navegador descarga el archivo con su nombre real y tipo correcto.


4. Consideraciones especiales (MIME, CLOB)

  • Si el contenido es CLOB, primero conviértelo a BLOB:
 FUNCTION clob_to_blob(p_clob IN CLOB) RETURN BLOB IS l_blob BLOB; BEGIN DBMS_LOB.CREATETEMPORARY(l_blob, TRUE); DBMS_LOB.CONVERTTOBLOB(l_blob, p_clob, DBMS_LOB.LOBMAXSIZE, 1, 1); RETURN l_blob; END; 
  • Usa el MIME correcto. Ejemplos:
    • PDF → application/pdf
    • Excel → application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
    • Imagen PNG → image/png
  • Para contenido visual como imágenes o PDF, puedes usar inline en lugar de attachment.

5. Buenas prácticas

  • ✅ Siempre valida que el BLOB exista antes de ejecutar DOWNLOAD.
  • ✅ Usa headers MIME correctos según el tipo de archivo.
  • ✅ Incluye un botón claro con ícono o texto explicativo.
  • ✅ Nunca descargues datos sensibles sin control de sesión/rol.
  • ✅ Audita las descargas si son parte de un proceso legal o de cumplimiento.

6. Conclusión

APEX_HTTP.DOWNLOAD es una herramienta poderosa y elegante para descargar archivos desde tus aplicaciones APEX sin esfuerzo.

Con unas pocas líneas de código puedes ofrecer:

  • Contratos
  • Facturas
  • Reportes
  • Imágenes
  • Archivos ZIP generados

Es parte del toolbox moderno de cualquier desarrollador APEX.

Descargar ejemplo (ZIP)


¿Quieres aprender más?

Accede al módulo completo de manejo de archivos, PDF y CLOBs en Oracle APEX aquí:

Ver curso en Aprendiz Academy
Incluye ejercicios paso a paso, integración con ORDS y generación de reportes con PL/SQL.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.