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

更新时间:2017-06-09    来源:中文酷站    手机版     字体:

【www.bbyears.com--中文酷站】

 代码如下

 

$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;
  }
}

本文来源:http://www.bbyears.com/kuzhan/33238.html

热门标签

更多>>

本类排行