加入收藏 | 设为首页 | 会员中心 | 我要投稿 银川站长网 (https://www.0951zz.com/)- 云通信、基础存储、云上网络、机器学习、视觉智能!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php支撑分块与断点续传文件下载功能代码

发布时间:2023-06-12 12:56:03 所属栏目:PHP教程 来源:
导读:本文章要介绍了这篇文章是一篇关于php流下载,就是可以支持分块与断点续传文件下载,有需要的朋友可以看看,代码如下:$dowmFile = dirname ( __FILE__ ) . '/Nokia - Always Here.mp3'; //要下载的文件,绝对或

本文章要介绍了这篇文章是一篇关于php流下载,就是可以支持分块与断点续传文件下载,有需要的朋友可以看看,代码如下:

$dowmFile = dirname ( __FILE__ ) . '/Nokia - Always Here.mp3'; //要下载的文件,绝对或相对 

$dowmName = 'Nokia - Always Here.mp3'; 

ob_start (); 

getlocalfile ( $dowmFile, $dowmName ); 

flush (); 

ob_flush (); 

function getlocalfile($fname, $filename = '') { 

  $fsize = filesize ( $fname ); 

  header ( 'Cache-Control: public' ); 

  header ( 'Pragma: public' ); 

  header ( 'Accept-Ranges: bytes' ); 

  header ( 'Connection: close' ); 

  header ( 'Content-Type: ' . MIMEType ( $fname ) ); 

  //header('Content-Type: application/octet-stream'); 

  if (isset ( $filename {0} )) { 

    header ( 'Content-Disposition: attachment;filename=' . $filename ); 

  } 

  if ($fp = @fopen ( $fname, 'rb' )) { 

    $start = 0; 

    $end = $fsize; 

    $isRange = isset ( $_SERVER ['HTTP_RANGE'] ) && ($_SERVER ['HTTP_RANGE'] != ''); 

    if ($isRange) { 

      preg_match ( '/^bytes=([0-9]*)-([0-9]*)$/i', $_SERVER ['HTTP_RANGE'], $match ); 

      $start = $match [1]; 

      $end = $match [2]; 

      $isset_start = isset ( $start {0} ); 

      $isset_end = isset ( $end {0} ); 

      if ($isset_start && $isset_end) { 

        //分块下载 

        if ($start >= $fsize || $start < 0 || $start > $end) { 

          $start = 0; 

          $end = $fsize; 

        } else if ($end >= $fsize) { 

          $end = $fsize - $start; 

        } else { 

          $end -= $start - 1; 

        } 

      } else if ($isset_start && ! $isset_end) { 

        //指定位置到结束 

        if ($start >= $fsize || $start < 0) { 

          $start = 0; 

          $end = $fsize; 

        } else { 

          $end = $fsize - $start; 

        } 

      } else if (! $isset_start && $isset_end) { 

        //最后n个字节 

        $end = $end > $fsize ? $fsize : $end; 

        $start = $fsize - $end; 

      } else { 

        $start = 0; 

        $end = $fsize; 

      } 

    } 

    if ($isRange) { 

      fseek ( $fp, $start ); 

      header ( 'HTTP/1.1 206 Partial Content' ); 

      header ( 'Content-Length: ' . $end ); 

      header ( 'Content-Ranges: bytes ' . $start . '-' . ($end + $start - 1) . '/' . $fsize ); 

    } else { 

      header ( 'Content-Length: ' . $fsize ); 

    } 

    if (function_exists ( 'fpassthru' ) && ($end + $start) == $fsize) { 

      fpassthru ( $fp ); 

    } else { 

      echo fread ( $fp, $end ); 

    } 

  } else { 

    header ( 'Content-Length: ' . $fsize ); 

    readfile ( $fname ); 

  } 

  //@header("Content-Type: ".mime_content_type($fname)); 

function MIMEType($fname) { 

  $fileSuffix = strtolower ( substr ( $fname, strrpos ( $fname, '.' ) + 1 ) ); 

  switch ($fileSuffix) { 

    case 'avi' : 

      return 'video/msvideo'; 

    case 'wmv' : 

      return 'video/x-ms-wmv'; 

    case 'txt' : 

      return 'text/plain'; 

    case 'htm' : 

    case 'html' : 

    case 'php' : 

      return 'text/html'; 

    case 'css' : 

      return 'text/css'; 

    case 'js' : 

      return 'application/javascript'; 

    case 'json' : 

    case 'xml' : 

    case 'zip' : 

    case 'pdf' : 

    case 'rtf' : 

    case 'tar' : 

      return 'application/' . $fileSuffix; 

    case 'swf' : 

      return 'application/x-shockwave-flash'; 

    case 'flv' : 

      return 'video/x-flv'; 

    case 'jpe' : 

    case 'jpg' : 

      return 'image/jpeg'; 

    case 'jpeg' : 

    case 'png' : 

    case 'gif' : 

    case 'bmp' : 

    case 'tiff' : 

      return 'image/' . $fileSuffix; 

    case 'ico' : 

      return 'image/vnd.microsoft.icon'; 

    case 'tif' : 

      return 'image/tiff'; 

    case 'svg' : 

    case 'svgz' : 

      return 'image/svg+xml'; 

    case 'rar' : 

      return 'application/x-rar-compressed'; 

    case 'exe' : 

    case 'msi' : 

      return 'application/x-msdownload'; 

    case 'cab' : 

      return 'application/vnd.ms-cab-compressed'; 

    case 'aif' : 

      return 'audio/aiff'; 

    case 'mpg' : 

    case 'mpe' : 

    case 'mp3' : 

      return 'audio/mpeg'; 

    case 'mpeg' : 

    case 'wav' : 

    case 'aiff' : 

      return 'audio/' . $fileSuffix; 

    case 'qt' : 

    case 'mov' : 

      return 'video/quicktime'; 

    case 'psd' : 

      return 'image/vnd.adobe.photoshop'; 

    case 'ai' : 

    case 'eps' : 

    case 'ps' : 

      return 'application/postscript'; 

    case 'doc' : 

    case 'docx' : 

      return 'application/msword'; 

    case 'xls' : 

    case 'xlt' : 

    case 'xlm' : 

    case 'xld' : 

    case 'xla' : 

    case 'xlc' : 

    case 'xlw' : 

    case 'xll' : 

      return 'application/vnd.ms-excel'; 

    case 'ppt' : 

    case 'pps' : 

      return 'application/vnd.ms-powerpoint'; 

    case 'odt' : 

      return 'application/vnd.oasis.opendocument.text'; 

    case 'ods' : 

      return 'application/vnd.oasis.opendocument.spreadsheet'; 

    default ://开源代码Cuoxin.com 

      if (function_exists ( 'mime_content_type' )) { 

        $fileSuffix = mime_content_type ( $filename ); 

      } else { 

        $fileSuffix = 'application/octet-stream'; 

      } 

      return $fileSuffix; 

      break; 

  } 

(编辑:银川站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!