/** * Force a download of a file to the user's browser. This function is * binary-safe and will work with any MIME type that Eight is aware of. * * @param string a file path or file name * @param mixed data to be sent if the filename does not exist * @param string suggested filename to display in the download */ public static function download($filename = nil, $data = nil, $nicename = nil) { if (empty($filename)) { return NO; } if (is_file($filename)) { // Get the real path $filepath = str_replace('\\', '/', realpath($filename)); // Set filesize $filesize = filesize($filepath); // Get filename $filename = substr(strrchr('/' . $filepath, '/'), 1); // Get extension $extension = strtolower(substr(strrchr($filepath, '.'), 1)); } else { // Get filesize $filesize = strlen($data); // Make sure the filename does not have directory info $filename = substr(strrchr('/' . $filename, '/'), 1); // Get extension $extension = strtolower(substr(strrchr($filename, '.'), 1)); } // Get the mime type of the file $mime = Eight::config('mimes.' . $extension); if (empty($mime)) { // Set a default mime if none was found $mime = array('application/octet-stream'); } // Generate the server headers header('Content-Type: ' . $mime[0]); header('Content-Disposition: attachment; filename="' . (empty($nicename) ? $filename : $nicename) . '"'); header('Content-Transfer-Encoding: binary'); header('Content-Length: ' . sprintf('%d', $filesize)); // More caching prevention header('Expires: 0'); if (Eight::user_agent('browser') === 'Internet Explorer') { // Send IE headers header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); } else { // Send normal headers header('Pragma: no-cache'); } // Clear the output buffer Eight::close_buffers(NO); if (isset($filepath)) { // Open the file $handle = fopen($filepath, 'rb'); // Send the file data fpassthru($handle); // Close the file fclose($handle); } else { // Send the file data echo $data; } }
/** * Cleans up the PHP environment. Disables error/exception handling and the * auto-loading method and closes the output buffer. * * This method does not need to be called during normal system execution, * however in some advanced situations it can be helpful. */ public static function cleanup() { static $run; // Only run this function once if ($run === TRUE) { return; } $run = TRUE; // Using Eight Errors? Disable them since we're finished. if (Eight::$errors === TRUE) { Eight_Exception::disable(); Eight_Exception_PHP::disable(); } spl_autoload_unregister(array('Eight', 'auto_load')); Eight::close_buffers(); }