Home  >  Article  >  Backend Development  >  PHP supports chunked and breakpoint resume file download function code_PHP tutorial

PHP supports chunked and breakpoint resume file download function code_PHP tutorial

WBOY
WBOYOriginal
2016-07-20 11:10:36838browse

This article will introduce that this article is about PHP stream downloading, which can support chunked and breakpoint resume file downloads. Friends in need can take a look.

The code is as follows Copy code

$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 :
      if (function_exists ( 'mime_content_type' )) {
        $fileSuffix = mime_content_type ( $filename );
      } else {
        $fileSuffix = 'application/octet-stream';
      }
      return $fileSuffix;
      break;
  }
}


www.bkjia.comtruehttp://www.bkjia.com/PHPjc/444707.htmlTechArticle本文章要介绍了这篇文章是一篇关于php流下载,就是可以支持分块与断点续传文件下载,有需要的朋友可以看看。 代码如下 复制代码 $dow...
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn