当前位置:首页 > PHP教程 > php应用 > 列表

PHP使用range协议实现输出文件断点续传代码实例

发布:smiling 来源: PHP粉丝网  添加日期:2021-03-13 19:54:02 浏览: 评论:0 

这篇文章主要介绍了PHP使用range协议实现输出文件断点续传代码实例,需要的朋友可以参考下

range协议用途:一般是用在断点续传的时候,但是实际的用户很大,例如你的web server需要输出一个大文件,那么用range可以分段输出,缓解压力。同时在提供音乐视频等服务时可以缓冲下载,如果用户中途关闭,可以节约网络带宽。

  1. <?php 
  2.  
  3. // 文件名 
  4. $filename = $_GET ['filename']; 
  5.  
  6. // 文件路径 
  7. $location = 'media/' . $filename
  8.  
  9. // 后缀 
  10. $extension = substr ( strrchr ( $filename'.' ), 1 ); 
  11.  
  12. if ($extension == "mp3") { 
  13.     $mimeType = "audio/mpeg"
  14. else if ($extension == "ogg") { 
  15.     $mimeType = "audio/ogg"
  16.  
  17. if (! file_exists ( $location )) { 
  18.     header ( "HTTP/1.1 404 Not Found" ); 
  19.     return
  20.  
  21. $size = filesize ( $location ); 
  22. $time = date ( 'r'filemtime ( $location ) ); 
  23.  
  24. $fm = @fopen ( $location'rb' ); 
  25. if (! $fm) { 
  26.     header ( "HTTP/1.1 505 Internal server error" ); 
  27.     return
  28.  
  29. $begin = 0; 
  30. $end = $size - 1; 
  31.  
  32. if (isset ( $_SERVER ['HTTP_RANGE'] )) { 
  33.     if (preg_match ( '/bytes=\h*(\d+)-(\d*)[\D.*]?/i'$_SERVER ['HTTP_RANGE'], $matches )) { 
  34.         // 读取文件,起始节点 
  35.         $begin = intval ( $matches [1] ); 
  36.  
  37.         // 读取文件,结束节点 
  38.         if (! emptyempty ( $matches [2] )) { 
  39.             $end = intval ( $matches [2] ); 
  40.         } 
  41.     } 
  42.  
  43. if (isset ( $_SERVER ['HTTP_RANGE'] )) { 
  44.     header ( 'HTTP/1.1 206 Partial Content' ); 
  45. else { 
  46.     header ( 'HTTP/1.1 200 OK' ); 
  47.  
  48. header ( "Content-Type: $mimeType" ); 
  49. header ( 'Cache-Control: public, must-revalidate, max-age=0' ); 
  50. header ( 'Pragma: no-cache' ); 
  51. header ( 'Accept-Ranges: bytes' ); 
  52. header ( 'Content-Length:' . (($end - $begin) + 1) ); 
  53.  
  54. if (isset ( $_SERVER ['HTTP_RANGE'] )) { 
  55.     header ( "Content-Range: bytes $begin-$end/$size" ); 
  56.  
  57. header ( "Content-Disposition: inline; filename=$filename" ); 
  58. header ( "Content-Transfer-Encoding: binary" ); 
  59. header ( "Last-Modified: $time" ); 
  60.  
  61. $cur = $begin
  62. //www.phpfensi.com 
  63. // 定位指针 
  64. fseek ( $fm$begin, 0 ); 
  65.  
  66. while ( ! feof ( $fm ) && $cur <= $end && (connection_status () == 0) ) { 
  67.     print fread ( $fm, min ( 1024 * 16, ($end - $cur) + 1 ) ); 
  68.     $cur += 1024 * 16; 
range协议官方文档:http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

Tags: range协议 PHP文件断点

分享到: