View file lib/Getf.php

File size: 7.83Kb
  1. <?php
  2. /**
  3. *
  4. * This software is distributed under the GNU GPL v3.0 license.
  5. * @author Gemorroj
  6. * @copyright 2008-2011 http://wapinet.ru
  7. * @license http://www.gnu.org/licenses/gpl-3.0.txt
  8. * @link http://wapinet.ru/gmanager/
  9. * @version 0.8 beta
  10. *
  11. * PHP version >= 5.2.1
  12. *
  13. */
  14.  
  15.  
  16. class Getf
  17. {
  18. /**
  19. * Downloader
  20. *
  21. * @param string $f Content
  22. * @param string $name Output filename
  23. * @param bool $attach
  24. * @param string $mime Mime type
  25. * @return void
  26. */
  27. public static function download ($f, $name, $attach = false, $mime = '')
  28. {
  29. ob_implicit_flush(1);
  30. set_time_limit(9999);
  31.  
  32. ini_set('zlib.output_compression', 'Off');
  33. ini_set('output_handler', '');
  34.  
  35. $sz = $len = strlen($f);
  36.  
  37. // "От" и "До" по умолчанию
  38. $file_range = array(
  39. 'from' => 0,
  40. 'to' => $len
  41. );
  42.  
  43. // Если докачка
  44. $range = isset($_SERVER['HTTP_RANGE']);
  45. if ($range) {
  46. if (preg_match('/bytes=(\d+)\-(\d*)/i', $_SERVER['HTTP_RANGE'], $matches)) {
  47. // "От", "До" если "До" нету, "До" равняется размеру файла
  48. $file_range = array('from' => $matches[1], 'to' => (!$matches[2]) ? $len : $matches[2]);
  49. // Режем переменную в соответствии с данными
  50. if ($file_range) {
  51. $f = substr($f, $file_range['from'], $file_range['to']);
  52. $sz = $file_range['to'] - $file_range['from'];
  53. }
  54. }
  55. }
  56.  
  57. // Хэш
  58. $etag = md5($f);
  59. $etag = substr($etag, 0, 4) . '-' . substr($etag, 5, 5) . '-' . substr($etag, 10, 8);
  60.  
  61. if (isset($_SERVER['HTTP_IF_NONE_MATCH'])) {
  62. if ($_SERVER['HTTP_IF_NONE_MATCH'] == '"' . $etag . '"') {
  63. header($_SERVER['SERVER_PROTOCOL'] . ' 304 Not Modified');
  64. //header('Date: ' . gmdate('r'));
  65. exit;
  66. }
  67. }
  68.  
  69.  
  70. // Ставим MIME в зависимости от расширения
  71. if (!$mime) {
  72. switch (strtolower(pathinfo($name, PATHINFO_EXTENSION))) {
  73. case 'jar':
  74. $mime = 'application/java-archive';
  75. break;
  76.  
  77.  
  78. case 'jad':
  79. $mime = 'text/vnd.sun.j2me.app-descriptor';
  80. break;
  81.  
  82.  
  83. case 'cab':
  84. $mime = 'application/vnd.ms-cab-compressed';
  85. break;
  86.  
  87.  
  88. case 'sis':
  89. $mime = 'application/vnd.symbian.install';
  90. break;
  91.  
  92.  
  93. case 'zip':
  94. $mime = 'application/x-zip';
  95. break;
  96.  
  97.  
  98. case 'rar':
  99. $mime = 'application/x-rar-compressed';
  100. break;
  101.  
  102.  
  103. case '7z':
  104. $mime = 'application/x-7z-compressed';
  105. break;
  106.  
  107.  
  108. case 'gz':
  109. case 'tgz':
  110. $mime = 'application/x-gzip';
  111. break;
  112.  
  113.  
  114. case 'bz':
  115. case 'bz2':
  116. $mime = 'application/x-bzip';
  117. break;
  118.  
  119.  
  120. case 'jpg':
  121. case 'jpe':
  122. case 'jpeg':
  123. $mime = 'image/jpeg';
  124. break;
  125.  
  126.  
  127. case 'gif':
  128. $mime = 'image/gif';
  129. break;
  130.  
  131.  
  132. case 'png':
  133. $mime = 'image/png';
  134. break;
  135.  
  136.  
  137. case 'bmp':
  138. $mime = 'image/bmp';
  139. break;
  140.  
  141.  
  142. case 'txt':
  143. case 'dat':
  144. case 'php':
  145. case 'php4':
  146. case 'php5':
  147. case 'phtml':
  148. case 'htm':
  149. case 'html':
  150. case 'shtm':
  151. case 'shtml':
  152. case 'wml':
  153. case 'css':
  154. case 'js':
  155. case 'xml':
  156. case 'sql':
  157. case 'tpl':
  158. case 'tmp':
  159. case 'cgi':
  160. case 'py':
  161. case 'pl':
  162. case 'rb':
  163. $mime = 'text/plain';
  164. break;
  165.  
  166.  
  167. case 'mmf':
  168. $mime = 'application/x-smaf';
  169. break;
  170.  
  171.  
  172. case 'mid':
  173. $mime = 'audio/mid';
  174. break;
  175.  
  176.  
  177. case 'mp3':
  178. $mime = 'audio/mpeg';
  179. break;
  180.  
  181.  
  182. case 'amr':
  183. $mime = 'audio/amr';
  184. break;
  185.  
  186.  
  187. case 'wav':
  188. $mime = 'audio/x-wav';
  189. break;
  190.  
  191.  
  192. case 'mp4':
  193. $mime = 'video/mp4';
  194. break;
  195.  
  196.  
  197. case 'wmv':
  198. $mime = 'video/x-ms-wmv';
  199. break;
  200.  
  201.  
  202. case '3gp':
  203. $mime = 'video/3gpp';
  204. break;
  205.  
  206.  
  207. case 'avi':
  208. $mime = 'video/x-msvideo';
  209. break;
  210.  
  211.  
  212. case 'mpg':
  213. case 'mpe':
  214. case 'mpeg':
  215. $mime = 'video/mpeg';
  216. break;
  217.  
  218.  
  219. case 'pdf':
  220. $mime = 'application/pdf';
  221. break;
  222.  
  223.  
  224. case 'doc':
  225. case 'docx':
  226. case 'dot':
  227. $mime = 'application/msword';
  228. break;
  229.  
  230.  
  231. case 'swf':
  232. $mime = 'application/x-shockwave-flash';
  233. break;
  234.  
  235.  
  236. case 'xls':
  237. $mime = 'application/vnd.ms-excel';
  238. break;
  239.  
  240.  
  241. case 'xlsx':
  242. $mime = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
  243. break;
  244.  
  245.  
  246. case 'svg':
  247. $mime = 'image/svg+xml';
  248. break;
  249.  
  250.  
  251. case 'ico':
  252. $mime = 'image/x-icon';
  253. break;
  254.  
  255.  
  256. default:
  257. $mime = 'application/octet-stream';
  258. break;
  259. }
  260. }
  261.  
  262.  
  263. // Заголовки...
  264. if ($file_range['from']) {
  265. header($_SERVER['SERVER_PROTOCOL'] . ' 206 Partial Content');
  266. } else {
  267. header($_SERVER['SERVER_PROTOCOL'] . ' 200 OK');
  268. }
  269.  
  270. header('ETag: "' . $etag . '"');
  271.  
  272.  
  273. //header('Date: ' . gmdate('r'));
  274. //header('Content-Transfer-Encoding: binary');
  275. //header('Last-Modified: ' . gmdate('r'));
  276.  
  277. // Кэш
  278. header('Cache-Control: public, must-revalidate, max-age=60');
  279. header('Pragma: cache');
  280. //header('Expires: Tue, 10 Apr 2038 01:00:00 GMT');
  281.  
  282.  
  283. //header('Connection: Close');
  284. header('Keep-Alive: timeout=10, max=60');
  285. header('Connection: Keep-Alive');
  286.  
  287. header('Accept-Ranges: bytes');
  288. header('Content-Length: ' . $sz);
  289.  
  290.  
  291. // Если докачка
  292. if ($range) {
  293. header('Content-Range: bytes ' . $file_range['from'] . '-' . $file_range['to'] . '/' . $len);
  294. }
  295.  
  296.  
  297. // Если отдаем как аттач
  298. if ($attach) {
  299. header('Content-Type: ' . $mime);
  300. header('Content-Disposition: attachment; filename="' . $name . '"');
  301. } else if ($mime == 'text/plain') {
  302. // header('Content-Type: text/plain; charset=' . $charset);
  303. header('Content-Type: text/plain;');
  304. } else {
  305. header('Content-Type: ' . $mime);
  306. }
  307. //ob_end_flush();
  308.  
  309. exit($f);
  310. }
  311. }
  312.  
  313. ?>