diff options
Diffstat (limited to 'system/helpers/download.php')
| -rw-r--r-- | system/helpers/download.php | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/system/helpers/download.php b/system/helpers/download.php new file mode 100644 index 0000000..0bdb04d --- /dev/null +++ b/system/helpers/download.php @@ -0,0 +1,135 @@ +<?php defined('SYSPATH') OR die('No direct access allowed.'); +/** + * Download helper class. + * + * @package Kohana + * @author Kohana Team + * @copyright (c) 2007-2009 Kohana Team + * @license http://kohanaphp.com/license + */ +class download_Core { + + /** + * Send headers necessary to invoke a "Save As" dialog + * + * @link http://support.microsoft.com/kb/260519 + * @link http://greenbytes.de/tech/tc2231/ + * + * @param string file name + * @return string file name as it was sent + */ + public static function dialog($filename) + { + $filename = basename($filename); + + header('Content-Disposition: attachment; filename="'.$filename.'"'); + + return $filename; + } + + /** + * Send the contents of a file or a data string with the proper MIME type and exit. + * + * @uses exit() + * @uses Kohana::close_buffers() + * + * @param string a file path or file name + * @param string optional data to send + * @return void + */ + public static function send($filename, $data = NULL) + { + if ($data === NULL) + { + $filepath = realpath($filename); + + $filename = basename($filepath); + $filesize = filesize($filepath); + } + else + { + $filename = basename($filename); + $filesize = strlen($data); + } + + // Retrieve MIME type by extension + $mime = Kohana::config('mimes.'.strtolower(substr(strrchr($filename, '.'), 1))); + $mime = empty($mime) ? 'application/octet-stream' : $mime[0]; + + // Close output buffers + Kohana::close_buffers(FALSE); + + // Clear any output + Event::add('system.display', create_function('', 'Kohana::$output = "";')); + + // Send headers + header("Content-Type: $mime"); + header('Content-Length: '.sprintf('%d', $filesize)); + header('Content-Transfer-Encoding: binary'); + + // Send data + if ($data === NULL) + { + $handle = fopen($filepath, 'rb'); + + fpassthru($handle); + fclose($handle); + } + else + { + echo $data; + } + + exit; + } + + /** + * Force the download of a file by the user's browser by preventing any + * caching. Contains a workaround for Internet Explorer. + * + * @link http://support.microsoft.com/kb/316431 + * @link http://support.microsoft.com/kb/812935 + * + * @uses download::dialog() + * @uses download::send() + * + * @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 + * @return void + */ + public static function force($filename = NULL, $data = NULL, $nicename = NULL) + { + download::dialog(empty($nicename) ? $filename : $nicename); + + // Prevent caching + header('Expires: Thu, 01 Jan 1970 00:00:00 GMT'); + + if (request::user_agent('browser') === 'Internet Explorer' AND request::user_agent('version') <= '6.0') + { + // HTTP 1.0 + header('Pragma:'); + + // HTTP 1.1 with IE extensions + header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); + } + else + { + // HTTP 1.0 + header('Pragma: no-cache'); + + // HTTP 1.1 + header('Cache-Control: no-cache, max-age=0'); + } + + if (is_file($filename)) + { + download::send($filename); + } + else + { + download::send($filename, $data); + } + } + +} // End download |
