Categorías: Tutoriales

Descargar ficheros sin usar enlaces con PHP

Cuando me refiero a no usar enlaces, me refiero a no usar enlaces al fichero en sí, por ejemplo: https://www.linuxhispano.net/logo.jpg sino a algo así como http://www.dominio.com/obtener_fichero.php?id_fichero=100.

¿Con qué idea podemos querer utilizar esto? Además de ocultar algo más de nuestra estructura interna, que siempre viene bien, es útil saber cómo descargar ficheros de este modo para tener un mayor control sobre el flujo, de forma que podamos comprobar rol de la persona que descarga, acceder a una base de datos para obtener el fichero de un campo BLOB o culaquier otro tratamiento que queramos hacer.

Para ello con PHP y suponiendo que tenemos el fichero ya accesible en disco (si está almacenado en una BBDD una solución podría ser crear un temporal mientras tanto), sólo tendremos que hacer lo siguiente:

header('Content-Description: File Transfer');
header("Content-Type: application/force-download");
header('Content-Disposition: attachment; filename='.basename($ruta));
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . obtenerTamanhoFichero($ruta));
readfile($ruta);

exit;

Utilizo una funcion obtenerTamanhoFichero que ahora os presentaré porque la función equivalente de PHP en ocasiones no funciona correctamente. Por cierto, el fichero en cuestión estará en la ruta indicada por la variable correspondiente, $ruta.

function obtenerTamanhoFichero ($url)
{
    if (substr($url,0,4)=='http')
   {
        $x = array_change_key_case(get_headers($url, 1),CASE_LOWER);
        if ( strcasecmp($x[0], 'HTTP/1.1 200 OK') != 0 ) { $x = $x['content-length'][1]; }
        else { $x = $x['content-length']; }
    }
    else { $x = @filesize($url); } 

    return $x;
}

Si queréis hacernos referencias a soluciones similares para otras tecnologías os lo agradeceremos, pero como básicamente jugamos con las cabeceras HTTP suponemos que será algo muy similar.

F. Javier Carazo Gil

Cofundador de CODECTION, empresa especializada en WordPress, autor de un libro sobre WordPress (el primero en español) y multitud de artículos (en medios físicos y virtuales) sobre el tema. Participa en la comunidad WordPress de forma activa siendo parte del equipo organizador de la WordPress Meetup de Córdoba, dando charlas en diferentes WordCamp y siendo autor y coautor de multitud de plugins libres y premium para WordPress de gran éxito.

Ver comentarios

Entradas recientes

DeepSeek

2 días hace

Contacto

2 semanas hace

Smart-tv mute

2 semanas hace

STEAM OS

3 semanas hace

2025

4 semanas hace

El podcast de Linux Hispano – #072 – El hardware libre debe consolidarse como el software libre

https://www.youtube.com/embed/z-xGk9c_eOw Guionista y locutor: Manuel Ignacio López Quintero.Fecha de publicación: 31 de diciembre de 2024.

1 mes hace