summaryrefslogtreecommitdiff
path: root/system/helpers/download.php
diff options
context:
space:
mode:
Diffstat (limited to 'system/helpers/download.php')
-rw-r--r--system/helpers/download.php135
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