154 lines
3.9 KiB
PHP
154 lines
3.9 KiB
PHP
<?php
|
|
/**
|
|
* FuzeWorks.
|
|
*
|
|
* The FuzeWorks MVC PHP FrameWork
|
|
*
|
|
* Copyright (C) 2015 TechFuze
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
* @author TechFuze
|
|
* @copyright Copyright (c) 2013 - 2016, Techfuze. (http://techfuze.net)
|
|
* @copyright Copyright (c) 1996 - 2015, Free Software Foundation, Inc. (http://www.fsf.org/)
|
|
* @license http://opensource.org/licenses/GPL-3.0 GPLv3 License
|
|
*
|
|
* @link http://fuzeworks.techfuze.net
|
|
* @since Version 0.0.1
|
|
*
|
|
* @version Version 0.0.1
|
|
*/
|
|
|
|
/**
|
|
* FuzeWorks Download Helpers
|
|
*
|
|
* Converted from CodeIgniter.
|
|
*
|
|
* @package FuzeWorks
|
|
* @subpackage Helpers
|
|
* @category Helpers
|
|
* @author EllisLab Dev Team
|
|
* @link https://codeigniter.com/user_guide/helpers/download_helper.html
|
|
*/
|
|
|
|
// ------------------------------------------------------------------------
|
|
|
|
if ( ! function_exists('force_download'))
|
|
{
|
|
/**
|
|
* Force Download
|
|
*
|
|
* Generates headers that force a download to happen
|
|
*
|
|
* @param string filename
|
|
* @param mixed the data to be downloaded
|
|
* @param bool whether to try and send the actual file MIME type
|
|
* @return void
|
|
*/
|
|
function force_download($filename = '', $data = '', $set_mime = FALSE)
|
|
{
|
|
if ($filename === '' OR $data === '')
|
|
{
|
|
return;
|
|
}
|
|
elseif ($data === NULL)
|
|
{
|
|
if ( ! @is_file($filename) OR ($filesize = @filesize($filename)) === FALSE)
|
|
{
|
|
return;
|
|
}
|
|
|
|
$filepath = $filename;
|
|
$filename = explode('/', str_replace(DIRECTORY_SEPARATOR, '/', $filename));
|
|
$filename = end($filename);
|
|
}
|
|
else
|
|
{
|
|
$filesize = strlen($data);
|
|
}
|
|
|
|
// Set the default MIME type to send
|
|
$mime = 'application/octet-stream';
|
|
|
|
$x = explode('.', $filename);
|
|
$extension = end($x);
|
|
|
|
if ($set_mime === TRUE)
|
|
{
|
|
if (count($x) === 1 OR $extension === '')
|
|
{
|
|
/* If we're going to detect the MIME type,
|
|
* we'll need a file extension.
|
|
*/
|
|
return;
|
|
}
|
|
|
|
// Load the mime types
|
|
$mimes = Config::get('mimes')->toArray();
|
|
|
|
// Only change the default MIME if we can find one
|
|
if (isset($mimes[$extension]))
|
|
{
|
|
$mime = is_array($mimes[$extension]) ? $mimes[$extension][0] : $mimes[$extension];
|
|
}
|
|
}
|
|
|
|
/* It was reported that browsers on Android 2.1 (and possibly older as well)
|
|
* need to have the filename extension upper-cased in order to be able to
|
|
* download it.
|
|
*
|
|
* Reference: http://digiblog.de/2011/04/19/android-and-the-download-file-headers/
|
|
*/
|
|
if (count($x) !== 1 && isset($_SERVER['HTTP_USER_AGENT']) && preg_match('/Android\s(1|2\.[01])/', $_SERVER['HTTP_USER_AGENT']))
|
|
{
|
|
$x[count($x) - 1] = strtoupper($extension);
|
|
$filename = implode('.', $x);
|
|
}
|
|
|
|
if ($data === NULL && ($fp = @fopen($filepath, 'rb')) === FALSE)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Clean output buffer
|
|
if (ob_get_level() !== 0 && @ob_end_clean() === FALSE)
|
|
{
|
|
@ob_clean();
|
|
}
|
|
|
|
// Generate the server headers
|
|
header('Content-Type: '.$mime);
|
|
header('Content-Disposition: attachment; filename="'.$filename.'"');
|
|
header('Expires: 0');
|
|
header('Content-Transfer-Encoding: binary');
|
|
header('Content-Length: '.$filesize);
|
|
header('Cache-Control: private, no-transform, no-store, must-revalidate');
|
|
|
|
// If we have raw data - just dump it
|
|
if ($data !== NULL)
|
|
{
|
|
exit($data);
|
|
}
|
|
|
|
// Flush 1MB chunks of data
|
|
while ( ! feof($fp) && ($data = fread($fp, 1048576)) !== FALSE)
|
|
{
|
|
echo $data;
|
|
}
|
|
|
|
fclose($fp);
|
|
exit;
|
|
}
|
|
}
|