/wp-content/plugins/dlblock/lib/xSendfile/xSendfile.php

https://github.com/livinglab/openlab · PHP · 87 lines · 72 code · 10 blank · 5 comment · 15 complexity · e5458ca345b72d092d520fe444cccc2b MD5 · raw file

  1. <?php
  2. namespace XSendfile;
  3. class XSendfile
  4. {
  5. const SERVER_TYPE_APACHE = "Apache";
  6. const SERVER_TYPE_NGINX = "Nginx";
  7. const SERVER_TYPE_LIGHTTPD = "Lighttpd";
  8. public static function xSendfile($file, $downFilename=null, $serverType=null, $cache=true)
  9. {
  10. if($cache){
  11. if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])){
  12. $modifiedSince = $_SERVER['HTTP_IF_MODIFIED_SINCE'];
  13. $modifiedSince = strtotime($modifiedSince);
  14. if(filemtime($file)==$modifiedSince){
  15. header("HTTP/1.1 304: Not Modified");
  16. exit;
  17. }
  18. }
  19. if(isset($_SERVER['IF-NONE-MATCH']) && $_SERVER['IF-NONE-MATCH']==md5(filemtime($file))){
  20. header("HTTP/1.1 304: Not Modified");
  21. exit;
  22. }
  23. }
  24. $finfo = finfo_open(FILEINFO_MIME_TYPE);
  25. $mime = finfo_file($finfo, $file);
  26. if($mime){
  27. header("Content-type: $mime");
  28. }else{
  29. header("Content-type: application/octet-stream");
  30. }
  31. if($downFilename){
  32. $filename = $downFilename;
  33. }else{
  34. $filename = basename($file);
  35. }
  36. $encodedFilename = rawurlencode($filename);
  37. $userAgent = $_SERVER["HTTP_USER_AGENT"];
  38. // support ie
  39. if(preg_match("/MSIE/", $userAgent) || preg_match("/Trident\/7.0/", $userAgent)) {
  40. header('Content-Disposition: attachment; filename="' . $encodedFilename . '"');
  41. // support firefox
  42. } else if (preg_match("/Firefox/", $userAgent)) {
  43. header('Content-Disposition: attachment; filename*="utf8\'\'' . $encodedFilename . '"');
  44. // support safari and chrome
  45. } else {
  46. header('Content-Disposition: attachment; filename="' . $filename . '"');
  47. }
  48. header("Content-Length: ". filesize($file));
  49. if($cache){
  50. header("Last-Modified: ". gmdate('D, d M Y H:i:s', filemtime($file)) . ' GMT');
  51. header("Expires: ". gmdate('D, d M Y H:i:s', time()+2592000) . ' GMT');
  52. header("Cache-Control: max-age=2592000");
  53. header('Etag: " ' . md5(filemtime($file)) . '"');
  54. }
  55. if($serverType){
  56. switch ($serverType) {
  57. case self::SERVER_TYPE_APACHE:
  58. header("X-Sendfile: $file");
  59. break;
  60. case self::SERVER_TYPE_NGINX:
  61. header("X-Accel-Redirect: $file");
  62. break;
  63. case self::Lighttpd:
  64. header("X-LIGHTTPD-send-file: $file");
  65. break;
  66. default:
  67. # code...
  68. break;
  69. }
  70. }else{
  71. ob_clean();
  72. flush();
  73. // unknown server , use php stream
  74. readfile($file);
  75. }
  76. }
  77. }