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
Y si necesitamos comprimir el archivo antes de enviarlo al usuario, lo podemos hacer así :
Descargar ZIP
espero que sea de utilidad
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 archivoHemos 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
Puntos
1964
Visitas
Visitas
0
Resp
Resp
Por pablo hace 92 meses
Experto