Forzar descarga a un archivo php

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
1921
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