>  기사  >  백엔드 개발  >  유용한 PHP 헤더 다운로드 기능

유용한 PHP 헤더 다운로드 기능

WBOY
WBOY원래의
2016-07-25 08:54:40892검색
  1. /**

  2. * 파일 보내기
  3. *
  4. * @param string $fileName 파일 이름 또는 경로
  5. * @param string $fancyName 사용자 정의된 파일 이름, 비어 있으면 filename 사용
  6. * @param boolean $forceDownload 강제 다운로드 여부
  7. * @param 정수 $speedLimit 속도 제한, 단위는 바이트, 0은 제한 없음, Windows 서버를 지원하지 않음
  8. * @param string $$contentType 파일 형식, 기본값은 application/octet-stream
  9. *
  10. * @return 부울
  11. */
  12. function sendFile($fileName, $fancyName = ' ', $forceDownload = true, $speedLimit = 0, $contentType = '')
  13. {
  14. if (!is_reader($fileName))
  15. {
  16. header("HTTP/1.1 404 찾을 수 없음 ");
  17. false 반환;
  18. }
  19. $fileStat = stat($fileName);
  20. $lastModified = $fileStat['mtime'];

  21. $etag = '"' . $md5 . '-' . crc32($md5) . '"';
  22. header('마지막 수정: ' . gmdate("D, d M Y H:i:s", $lastModified) . ' GMT') 🎜> header("ETag: $etag");

  23. if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $lastModified)

  24. {
  25. header("HTTP/1.1 304 수정되지 않음");
  26. true를 반환합니다.
  27. }
  28. if (isset($_SERVER['HTTP_IF_UNMODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_UNMODIFIED_SINCE']) < $lastModified)
  29. {
  30. header("HTTP /1.1 304 수정되지 않음");
  31. true를 반환합니다.
  32. }
  33. if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && $_SERVER['HTTP_IF_NONE_MATCH'] == $etag)
  34. {
  35. header("HTTP/1.1 304 Not Modified");
  36. return true;
  37. }
  38. if ($fancyName == '')
  39. {
  40. $fancyName = basename($ 파일 이름);
  41. }

  42. if ($contentType == '')

  43. {
  44. $contentType = 'application/octet-stream';
  45. }
  46. $fileSize = $fileStat['size'];
  47. $contentLength = $fileSize;

  48. $isPartial = false;
  49. if (isset($_SERVER['HTTP_RANGE']))
  50. {
  51. if (preg_match('/^bytes=(d*) -(d*)$/', $_SERVER['HTTP_RANGE'], $matches))
  52. {
  53. $startPos = $matches[1];
  54. $endPos = $matches[2];
  55. if ($startPos == '' && $endPos == '')
  56. {
  57. return false;
  58. }

  59. if ($startPos == '')

  60. {
  61. $startPos = $fileSize - $endPos;
  62. $endPos = $fileSize - 1;
  63. }
  64. else if ($endPos == '')
  65. {
  66. $endPos = $fileSize - 1;
  67. }
  68. $startPos = $startPos < 0? 0 : $startPos;
  69. $endPos = $endPos > $fileSize - 1 ? $fileSize - 1 : $endPos;
  70. $length = $endPos - $startPos 1;
  71. if ($length < 0)
  72. {
  73. return false;
  74. }
  75. $ contentLength = $length;
  76. $isPartial = true;
  77. }
  78. }

  79. // 헤더 전송

  80. if ($isPartial)
  81. {
  82. header('HTTP/1.1 206 Partial Content');
  83. header("Content-Range: bytes $startPos-$endPos/$fileSize ");

  84. }

  85. else
  86. {
  87. 헤더("HTTP/1.1 200 OK");
  88. $startPos = 0;
  89. $endPos = $contentLength - 1;
  90. }
  91. 헤더 ('Pragma: 캐시');
  92. header('Cache-Control: public, must-revalidate, max-age=0');
  93. header('Accept-Ranges: bytes');
  94. 헤더 ('콘텐츠 유형: ' . $contentType);
  95. header('콘텐츠 길이: ' . $contentLength);

  96. if ($forceDownload)

  97. {
  98. header('Content-Disposition: attachment; filename="' . rawurlencode($fancyName). '"');//汉字自动转为URL编码
  99. header( 'Content-Disposition: attachmentname="' . $fancyName. '"');
  100. }
  101. header("Content-Transfer-Encoding: Binary");
  102. // header函数实现文件下载
  103. $bufferSize = 2048;

  104. if ($speedLimit != 0)
  105. {
  106. $packetTime = Floor($bufferSize * 1000000 / $speedLimit);
  107. }
  108. $bytesSent = 0;
  109. $fp = fopen($fileName, "rb");
  110. fseek($fp, $startPos);
  111. //fpassthru($fp);
  112. while ($bytesSent < $contentLength && !feof($fp) && Connection_status() == 0 )

  113. {
  114. if ($speedLimit != 0)
  115. {
  116. list($usec, $초) = 폭발(" ", 마이크로타임());
  117. $outputTimeStart = ((float)$usec (float)$sec);
  118. } // bbs.it-home.org
  119. $readBufferSize = $contentLength - $bytesSent < $버퍼크기? $contentLength - $bytesSent : $bufferSize;
  120. $buffer = fread($fp, $readBufferSize);
  121. echo $buffer;
  122. ob_flush();
  123. 플러시();
  124. $bytesSent = $readBufferSize;

  125. if ($speedLimit != 0)

  126. {
  127. list($usec, $sec) =explod(" ", microtime());
  128. $outputTimeEnd = ((float)$usec (float)$sec);

  129. $useTime = ((float) $outputTimeEnd - (float) $outputTimeStart) * 1000000;

  130. $sleepTime = round($packetTime - $useTime);
  131. if ($sleepTime > 0)
  132. {
  133. usleep($sleepTime);
  134. }
  135. }
  136. }
  137. return true;
  138. }
  139. ?>

제제대码


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.