Hola,
He estado mirando un poco de información por el foro y en el manual de php (en los comentarios).
Creo que lo que voy a hacer es poner los ficheros que quiero descargar en una ruta dentro del sistema de archivos de mi servidor la cual no sea publicamente accesible.
Luego creare una base de datos con los campos "id" y "path_fichero" (pondre el path del archivo y no el propio archivo en un campo binario ya que el peso del archivo es muy grande). De esta forma los link de descargas de la pagina serán del tipo
http://elsitio.com/descargas.php?id=45.
La pagina descargas.php deberá acceder a la base de datos para obtener la ruta del fichero dentro del sistema de archivos del servidor. Llegado a este punto lo que falte es empezar a servir el fichero al navegador.
He visto dos formas de hacer esto y me gustaría saber cual pensais que es mejor y xq o si es lo mismo (a priori a mi me parece que si..pero por si acaso..):
Tengo que decir que el tamaño de mis archivos de descargas pueden tener a llegar unos 100 Mb con lo cual no me gustaria que se tenga que hacer una copia
temporal en el servidor o que el fichero se tenga que cargar en memoria hasta que lo pueda servir
1ª.- $fichero=fopen($nombrefichero,'rb'); fpassthru($fichero);
2ª.- readfile ("path/nombrefichero");
(por lo que he leido con fopen obtengo un puntero y con fpassthru voy recorriendolo con lo cual creo que utilizando esta forma no se cargara mucho al servidor...que me podeis decir de esto??)
Por otro lado he estado viendo las distintas cabeceras que se deben mandar segun el navegador que este visitando el script.
En este foro he visto una posible opcion:
function descarga_fichero ($nombreFichero) {
// ob_clean ();
header("Content-Type: application/octet-stream");
header("Content-Length: " . filesize($nombreFichero));
header("Content-Disposition: attachment; filename=\"$nombreFichero\"");
$fichero = fopen($nombreFichero, 'rb');
if (!$fichero) {die("unable to open $fichero");}
fpassthru($fichero);
header ("Connection: close");
die ();
}
Y otra opción que he visto tb bastante interesante en php.net es:
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Disposition: attachment; filename=".basename($filename).";");
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($filename));
@readfile("$filename"); // pongo la arrabo delante para omitir mensaje de error en caso de fallo
exit();
Pues bueno señores, esta es toda la información que he recogido y me gustaría unas cuantas criticas sobre lo aquó comentado.
Un saludo a tod@s
Jose Corbacho