Просмотр кода
Название: Обработчик скачивания файлов по id
Описание: Код под основу скачки файлов по id с базы данных с ограничение скорости скачивания + треб. доработка
Добавил: Mr[G]Pro
Дата: 26 дек 2020, в 19:30 Комментарии (1)
Описание: Код под основу скачки файлов по id с базы данных с ограничение скорости скачивания + треб. доработка
<?php
$fileX = array('777' => 'fonS.mp3',
'666' => 'dog.gif');
try
{
if (isset($_GET['id']) && !empty($_GET['id'])) {
$id = $_GET['id']; //нужно создать фильтр для проверки id на число
if ($id > 0) {
$Dfile = (array_key_exists($id, $fileX) ? 1 : 0);
switch ($Dfile) {
case 1:
downloadFile($fileX[$id]);
break;
case 0:
throw new Exception("Данный файл не существует либо был удалён!");
break;
default:
throw new Exception("Что-то пошло не так");
break;
}
}
}
else throw new Exception("Файл для скачивания не указан!");
} catch (Exception $e) {
echo '<center>' . $e->getMessage() . '</center>';
}
function downloadFile ($fileLocation, $maxSpeed = 100000, $doStream = 0) {
if (connection_status () != 0) {
return (FALSE);
}
ini_set("zlib.output_compression", "Off");
$fileName = basename ($fileLocation);
$contentType = 'application/octet-stream';
$expFile = explode ('.', $fileName);
$endF = end ($expFile);
$extension = strtolower ($endF);
/* List of File Types */
$fileTypes['swf'] = 'application/x-shockwave-flash';
$fileTypes['pdf'] = 'application/pdf';
$fileTypes['exe'] = 'application/octet-stream';
$fileTypes['zip'] = 'application/zip';
$fileTypes['doc'] = 'application/msword';
$fileTypes['xls'] = 'application/vnd.ms-excel';
$fileTypes['ppt'] = 'application/vnd.ms-powerpoint';
$fileTypes['gif'] = 'image/gif';
$fileTypes['png'] = 'image/png';
$fileTypes['jpeg'] = 'image/jpg';
$fileTypes['jpg'] = 'image/jpg';
$fileTypes['rar'] = 'application/x-rar-compressed';
$fileTypes['epub'] = 'application/epub+zip';
$fileTypes['ra'] = 'audio/x-pn-realaudio';
$fileTypes['ram'] = 'audio/x-pn-realaudio';
$fileTypes['ogg'] = 'audio/x-pn-realaudio';
$fileTypes['wav'] = 'audio/wav';
$fileTypes['wmv'] = 'video/x-msvideo';
$fileTypes['avi'] = 'video/x-msvideo';
$fileTypes['asf'] = 'video/x-msvideo';
$fileTypes['divx'] = 'video/x-msvideo';
$fileTypes['mid'] = 'audio/midi';
$fileTypes['midi'] = 'audio/midi';
$fileTypes['mp3'] = 'audio/mpeg';
$fileTypes['mp4'] = 'audio/mpeg';
$fileTypes['mpeg'] = 'video/mpeg';
$fileTypes['mpg'] = 'video/mpeg';
$fileTypes['mpe'] = 'video/mpeg';
$fileTypes['mov'] = 'video/quicktime';
$fileTypes['swf'] = 'video/quicktime';
$fileTypes['3gp'] = 'video/quicktime';
$fileTypes['m4a'] = 'video/quicktime';
$fileTypes['aac'] = 'video/quicktime';
$fileTypes['m3u'] = 'video/quicktime';
if(!empty($fileTypes[$extension])){
$contentType = $fileTypes[$extension];
}
//lets clean the buffer first
ob_end_clean();
ob_start();
header ("Cache-Control: public");
header ("Content-Transfer-Encoding: binaryn");
header ('Content-Type: ' . $contentType);
$contentDisposition = 'attachment';
if ($doStream == 1) {
/* extensions to stream */
$array_listen = array('mp3', 'm3u', 'm4a', 'mid', 'ogg', 'ra', 'ram', 'wm',
'wav', 'wma', 'aac', '3gp', 'avi', 'mov', 'mp4', 'mpeg', 'mpg', 'swf', 'wmv', 'divx', 'asf');
if (in_array ($extension, $array_listen)) {
$contentDisposition = 'inline';
}
}
$agent = strtolower ($_SERVER['HTTP_USER_AGENT']);
if (strpos ($agent, 'msie') !== FALSE) {
$fileName = preg_replace ('/./', '%2e', $fileName, substr_count ($fileName, '.') - 1);
}
header ("Content-Disposition: $contentDisposition; filename="$fileName"");
header ("Accept-Ranges: bytes");
$range = 0;
$size = filesize ($fileLocation);
if (isset($_SERVER['HTTP_RANGE'])) {
list($a, $range) = explode ("=", $_SERVER['HTTP_RANGE']);
str_replace ($range, "-", $range);
$size2 = $size - 1;
$new_length = $size - $range;
header ("HTTP/1.1 206 Partial Content");
header ("Content-Length: $new_length");
header ("Content-Range: bytes $range$size2/$size");
}
else {
$size2 = $size - 1;
header ("Content-Range: bytes 0-$size2/$size");
header ("Content-Length: " . $size);
}
if ($size == 0) {
die('Zero byte file! Aborting download');
}
// set_magic_quotes_runtime(0);
$fp = fopen ("$fileLocation", "rb");
fseek ($fp, $range);
$connection = connection_status ();
while (!feof ($fp) and (connection_status () == 0)) {
set_time_limit (0);
print(fread ($fp, 1024 * $maxSpeed));
flush ();
ob_flush ();
sleep (1);
}
fclose ($fp);
return ;
}
?>
Добавил: Mr[G]Pro
Дата: 26 дек 2020, в 19:30 Комментарии (1)