Просмотр файла engine/includes/downloadfile.php

Размер файла: 1.8Kb
  1. <?
  2.  
  3. function DownloadFile($filename, $name, $mimetype='application/octet-stream')
  4. {
  5. if (!file_exists($filename))
  6. die('Файл не найден');
  7. @ob_end_clean();
  8. $from=0;
  9. $size=filesize($filename);
  10. $to=$size;
  11. if (isset($_SERVER['HTTP_RANGE']))
  12. {
  13. if (preg_match ('#bytes=-([0-9]*)#i',$_SERVER['HTTP_RANGE'],$range)) // если указан отрезок от конца файла
  14. {
  15. $from=$size-$range[1];
  16. $to=$size;
  17. }
  18. elseif(preg_match('#bytes=([0-9]*)-#i',$_SERVER['HTTP_RANGE'],$range)) // если указана только начальная метка
  19. {
  20. $from=$range[1];
  21. $to=$size;
  22. }
  23. elseif(preg_match('#bytes=([0-9]*)-([0-9]*)#i',$_SERVER['HTTP_RANGE'],$range)) // если указан отрезок файла
  24. {
  25. $from=$range[1];
  26. $to=$range[2];
  27. }
  28. header('HTTP/1.1 206 Partial Content');
  29.  
  30.  
  31. $cr='Content-Range: bytes '.$from .'-'.$to.'/'.$size;
  32. }
  33. else
  34. header('HTTP/1.1 200 Ok');
  35. $etag=md5($filename);
  36. $etag=substr($etag, 0, 8) . '-' . substr($etag, 8, 7) . '-' . substr($etag, 15, 8);
  37. header('ETag: "'.$etag.'"');
  38. header('Accept-Ranges: bytes');
  39. header('Content-Length: ' .($to-$from));
  40. if (isset($cr))header($cr);
  41. header('Connection: close');
  42. header('Content-Type: ' . $mimetype);
  43. header('Last-Modified: ' . gmdate('r', filemtime($filename)));
  44. header("Last-Modified: ".gmdate("D, d M Y H:i:s", filemtime($filename))." GMT");
  45. header("Expires: ".gmdate("D, d M Y H:i:s", time() + 3600)." GMT");
  46. $f=fopen($filename, 'rb');
  47.  
  48.  
  49. if (preg_match('#^image/#i',$mimetype))
  50. header('Content-Disposition: filename="'.$name.'";');
  51. else
  52. header('Content-Disposition: attachment; filename="'.$name.'";');
  53.  
  54. fseek($f, $from, SEEK_SET);
  55. $size=$to;
  56. $downloaded=0;
  57. while(!feof($f) and !connection_status() and ($downloaded<$size))
  58. {
  59. $block = min(1024*8, $size - $downloaded);
  60. echo fread($f, $block);
  61. $downloaded += $block;
  62. flush();
  63. }
  64. fclose($f);
  65. }
  66.  
  67.  
  68. ?>