Размер файла: 7.83Kb
<?php
/**
*
* This software is distributed under the GNU GPL v3.0 license.
* @author Gemorroj
* @copyright 2008-2011 http://wapinet.ru
* @license http://www.gnu.org/licenses/gpl-3.0.txt
* @link http://wapinet.ru/gmanager/
* @version 0.8 beta
*
* PHP version >= 5.2.1
*
*/
class Getf
{
/**
* Downloader
*
* @param string $f Content
* @param string $name Output filename
* @param bool $attach
* @param string $mime Mime type
* @return void
*/
public static function download ($f, $name, $attach = false, $mime = '')
{
ob_implicit_flush(1);
set_time_limit(9999);
ini_set('zlib.output_compression', 'Off');
ini_set('output_handler', '');
$sz = $len = strlen($f);
// "От" и "До" по умолчанию
$file_range = array(
'from' => 0,
'to' => $len
);
// Если докачка
$range = isset($_SERVER['HTTP_RANGE']);
if ($range) {
if (preg_match('/bytes=(\d+)\-(\d*)/i', $_SERVER['HTTP_RANGE'], $matches)) {
// "От", "До" если "До" нету, "До" равняется размеру файла
$file_range = array('from' => $matches[1], 'to' => (!$matches[2]) ? $len : $matches[2]);
// Режем переменную в соответствии с данными
if ($file_range) {
$f = substr($f, $file_range['from'], $file_range['to']);
$sz = $file_range['to'] - $file_range['from'];
}
}
}
// Хэш
$etag = md5($f);
$etag = substr($etag, 0, 4) . '-' . substr($etag, 5, 5) . '-' . substr($etag, 10, 8);
if (isset($_SERVER['HTTP_IF_NONE_MATCH'])) {
if ($_SERVER['HTTP_IF_NONE_MATCH'] == '"' . $etag . '"') {
header($_SERVER['SERVER_PROTOCOL'] . ' 304 Not Modified');
//header('Date: ' . gmdate('r'));
exit;
}
}
// Ставим MIME в зависимости от расширения
if (!$mime) {
switch (strtolower(pathinfo($name, PATHINFO_EXTENSION))) {
case 'jar':
$mime = 'application/java-archive';
break;
case 'jad':
$mime = 'text/vnd.sun.j2me.app-descriptor';
break;
case 'cab':
$mime = 'application/vnd.ms-cab-compressed';
break;
case 'sis':
$mime = 'application/vnd.symbian.install';
break;
case 'zip':
$mime = 'application/x-zip';
break;
case 'rar':
$mime = 'application/x-rar-compressed';
break;
case '7z':
$mime = 'application/x-7z-compressed';
break;
case 'gz':
case 'tgz':
$mime = 'application/x-gzip';
break;
case 'bz':
case 'bz2':
$mime = 'application/x-bzip';
break;
case 'jpg':
case 'jpe':
case 'jpeg':
$mime = 'image/jpeg';
break;
case 'gif':
$mime = 'image/gif';
break;
case 'png':
$mime = 'image/png';
break;
case 'bmp':
$mime = 'image/bmp';
break;
case 'txt':
case 'dat':
case 'php':
case 'php4':
case 'php5':
case 'phtml':
case 'htm':
case 'html':
case 'shtm':
case 'shtml':
case 'wml':
case 'css':
case 'js':
case 'xml':
case 'sql':
case 'tpl':
case 'tmp':
case 'cgi':
case 'py':
case 'pl':
case 'rb':
$mime = 'text/plain';
break;
case 'mmf':
$mime = 'application/x-smaf';
break;
case 'mid':
$mime = 'audio/mid';
break;
case 'mp3':
$mime = 'audio/mpeg';
break;
case 'amr':
$mime = 'audio/amr';
break;
case 'wav':
$mime = 'audio/x-wav';
break;
case 'mp4':
$mime = 'video/mp4';
break;
case 'wmv':
$mime = 'video/x-ms-wmv';
break;
case '3gp':
$mime = 'video/3gpp';
break;
case 'avi':
$mime = 'video/x-msvideo';
break;
case 'mpg':
case 'mpe':
case 'mpeg':
$mime = 'video/mpeg';
break;
case 'pdf':
$mime = 'application/pdf';
break;
case 'doc':
case 'docx':
case 'dot':
$mime = 'application/msword';
break;
case 'swf':
$mime = 'application/x-shockwave-flash';
break;
case 'xls':
$mime = 'application/vnd.ms-excel';
break;
case 'xlsx':
$mime = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
break;
case 'svg':
$mime = 'image/svg+xml';
break;
case 'ico':
$mime = 'image/x-icon';
break;
default:
$mime = 'application/octet-stream';
break;
}
}
// Заголовки...
if ($file_range['from']) {
header($_SERVER['SERVER_PROTOCOL'] . ' 206 Partial Content');
} else {
header($_SERVER['SERVER_PROTOCOL'] . ' 200 OK');
}
header('ETag: "' . $etag . '"');
//header('Date: ' . gmdate('r'));
//header('Content-Transfer-Encoding: binary');
//header('Last-Modified: ' . gmdate('r'));
// Кэш
header('Cache-Control: public, must-revalidate, max-age=60');
header('Pragma: cache');
//header('Expires: Tue, 10 Apr 2038 01:00:00 GMT');
//header('Connection: Close');
header('Keep-Alive: timeout=10, max=60');
header('Connection: Keep-Alive');
header('Accept-Ranges: bytes');
header('Content-Length: ' . $sz);
// Если докачка
if ($range) {
header('Content-Range: bytes ' . $file_range['from'] . '-' . $file_range['to'] . '/' . $len);
}
// Если отдаем как аттач
if ($attach) {
header('Content-Type: ' . $mime);
header('Content-Disposition: attachment; filename="' . $name . '"');
} else if ($mime == 'text/plain') {
// header('Content-Type: text/plain; charset=' . $charset);
header('Content-Type: text/plain;');
} else {
header('Content-Type: ' . $mime);
}
//ob_end_flush();
exit($f);
}
}
?>