Vaya al Contenido

PHP Descarga de Archivos - SuperHispano

Saltar menú
SuperHispano
+34 012 345 678
info@example.com
España 03:19:18 sábado 07/02/26
Saltar menú
Saltar menú
Saltar menú
Taller > PHP > Manejo de archivos

Descarga de Archivos en PHP con readfile()


Normalmente, los navegadores modernos descargan automáticamente ciertos tipos de archivos como ZIP o EXE, pero otros tipos de archivos, como imágenes o archivos de texto, se abren directamente en el navegador. En estos casos, puedes usar PHP para forzar la descarga de estos archivos mediante el uso de la función readfile() y configurando las cabeceras HTTP adecuadas.

La función readfile()


La función readfile() en PHP es una forma sencilla de leer un archivo y enviarlo directamente al buffer de salida, lo que lo hace ideal para realizar descargas de archivos. Cuando esta función se combina con las cabeceras HTTP correctas, el navegador mostrará un cuadro de diálogo “Guardar como” en lugar de abrir el archivo.

Sintaxis:

readfile(string $filename, bool $use_include_path = false, ?resource $context = null): int|false

$filename: La ruta al archivo que se va a leer y descargar.
$use_include_path (opcional): Si se establece en true, se buscará en las rutas del include_path de php.ini para localizar el archivo.
$context (opcional): Un contexto de flujo que puede modificar el comportamiento de la función.

Ejemplo 1: Forzar la descarga de un archivo pequeño


Para descargar un archivo, es necesario establecer algunas cabeceras HTTP para indicarle al navegador que descargue el archivo en lugar de mostrarlo. Aquí te mostramos cómo hacerlo con la función readfile().

<?php
$archivo = 'imagen.png';

// Establecer el tipo de contenido para forzar la descarga
header('Content-Type: application/octet-stream');

// Establecer el nombre del archivo para la descarga
header('Content-Disposition: attachment; filename="' . basename($archivo) . '"');

// Leer el archivo y enviarlo al navegador
readfile($archivo);
?>


Explicación:
Content-Type: application/octet-stream: Esta cabecera indica que el archivo es un flujo de bytes y debe ser descargado.
Content-Disposition: attachment: Forza la descarga en lugar de permitir que el archivo se abra en el navegador.
readfile($archivo): Lee y envía el archivo al navegador.
Al visitar la URL del script en el navegador, aparecerá el cuadro de diálogo para descargar el archivo imagen.png.

Ejemplo 2: Descarga de archivos grandes por fragmentos


Cuando se trata de archivos grandes, puede no ser práctico cargar todo el archivo en la memoria del servidor de una sola vez. En su lugar, podemos leer y enviar el archivo por fragmentos o “chunks”. Esto ayuda a optimizar el uso de la memoria y previene problemas de tiempo de espera.

<?php
$archivo = 'archivo_grande.zip';
$tamano_chunk = 1024 * 1024; // Leer en fragmentos de 1 MB

// Establecer las cabeceras HTTP
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . basename($archivo) . '"');

// Abrir el archivo en modo de solo lectura binaria
$fp = fopen($archivo, 'rb');

// Iniciar la salida con el buffer activado
ob_start();

// Leer y enviar el archivo en fragmentos
while (!feof($fp)) {
echo fread($fp, $tamano_chunk);
ob_flush();
flush();
}

// Cerrar el archivo
fclose($fp);
?>


Explicación:
fopen($archivo, 'rb'): Abre el archivo en modo de lectura binaria.
fread($fp, $tamano_chunk): Lee el archivo en fragmentos de 1 MB.
ob_flush() y flush(): Aseguran que el buffer de salida se envíe al navegador en cada iteración, evitando que se agoten los recursos del servidor.
fclose($fp): Cierra el archivo al terminar la lectura.

Consideraciones adicionales


Evitar la caché: Para asegurarte de que el archivo se descarga correctamente y no se almacena en caché, puedes deshabilitar la caché del navegador añadiendo las siguientes cabeceras:

header('Cache-Control: no-cache, must-revalidate');
header('Expires: 0');


Manejo de archivos grandes: En algunos casos, para archivos extremadamente grandes, puede ser necesario ajustar los límites de tiempo de ejecución y de memoria en PHP:

ini_set('max_execution_time', '300'); // Aumentar el tiempo de ejecución máximo
ini_set('memory_limit', '512M'); // Aumentar el límite de memoria


Conclusión


La función readfile() es una herramienta poderosa y sencilla en PHP para descargar archivos desde el servidor. Configurar correctamente las cabeceras HTTP como Content-Type y Content-Disposition es clave para asegurar que el navegador descargue el archivo en lugar de abrirlo. Para archivos grandes, leer el archivo en fragmentos puede mejorar significativamente el rendimiento y reducir el uso de memoria.
+34 012 345 678
+34 012 345 678 (fax)
example@superhispano.com
Creado con WebSite X5
Regreso al contenido
Icono de la aplicación
SuperHispano Instale esta aplicación en su pantalla de inicio para una mejor experiencia
Toque Botón de instalación en iOS y luego "Agregar a su pantalla"