En ocasiones necesitamos forzar que el navegador del usuario descargue un archivo. Un PDF, una imagen, un archivo de acceso privado… son casos en los que podemos necesitar descargar un archivo y que en usos normales, el navegador abriría él mismo. Para realizarlo, nos hemos preparado una función que hará nuestro trabajo:

Descargar archivo
function downloadFile($fileUrl){
	// get file size	
	if (substr($fileUrl,0,4)=='http') {
        $fileSize = array_change_key_case(get_headers($fileUrl, 1),CASE_LOWER);
        if ( strcasecmp($fileSize[0], 'HTTP/1.1 200 OK') != 0 ) { $fileSize = $fileSize['content-length'][1]; }
        else { $fileSize = $fileSize['content-length']; }
    } else { $fileSize = @filesize($fileUrl); }
 
	// download file
	$ctype="application/octet-stream";
	header("Pragma: public");
	header("Expires: 0");
	header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
	header("Cache-Control: private",false);
	header("Content-Type: $ctype");
 
	header("Content-Disposition: attachment; filename=\"".basename($fileUrl)."\";" );
	header("Content-Transfer-Encoding: binary");
	header("Content-Length: ".$fileSize);
	readfile("$fileUrl");
	exit();
 
}
//con solo llamar la funcion downloadFile('/misfiles');
No tiene mucho secreto, recogemos el tamaño del archivo a descargar, cambiamos las cabeceras que vamos a escribir para forzar la descarga del archivo y enviamos su contenido, provocando su descarga.
Y si necesitamos comprimir el archivo antes de enviarlo al usuario, lo podemos hacer así :

Descargar ZIP
function downloadZipFile($fileUrl){
 
	$fileContent = file_get_contents($fileUrl);
	$compressed = gzencode($fileContent, 9);
	$fileSize = mb_strlen($compressed);
 
	// download file
	$ctype="application/octet-stream";
	header("Pragma: public");
	header("Expires: 0");
	header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
	header("Cache-Control: private",false);
	header("Content-Type: $ctype");
	header("Content-Disposition: attachment; filename=\"".basename($fileUrl).".gz\";" );
	header("Content-Transfer-Encoding: binary");
	header("Content-Length: ".$fileSize);
	echo $compressed;
	exit();
}
solo llamar la funcion mas carpeta o archivo
Hemos utilizado las funciones de compresión zlib de PHP, por lo que será necesario comprobar que tenemos disponibles las funciones antes de utilizarlo.

espero que sea de utilidad
1
Puntos
1887
Visitas
0
Resp
Por pablo hace 9 años
Master
Para comentar Inicia sesión o Regístrate
Phpres 2025@ All rights reserved.
Utilizamos cookies para mejorar la navegación en el sitio. Más información Aceptar