1
0
This repository has been archived on 2021-04-26. You can view files and clone it, but cannot push or open issues or pull requests.
gallery3-contrib/3.0/obsolete/web_client/system/helpers/download.php

138 lines
3.1 KiB
PHP

<?php defined('SYSPATH') OR die('No direct access allowed.');
/**
* Download helper class.
*
* $Id: download.php 4679 2009-11-10 01:45:52Z isaiah $
*
* @package Core
* @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