require_once('download.class.php');
date_default_timezone_set('Asia/Shanghai');
error_reporting(E_STRICT);
function errorHandler($errno, $errstr, $errfile, $errline) {
echo 'error:', $errstr, '
';
exit();
}
set_error_handler('errorHandler');
define('IS_DEBUG', true);
$filePath = 'test.zip';
$mimeType = 'audio/x-matroska';
$range = isset($_SERVER['HTTP_RANGE']) ? $_SERVER['HTTP_RANGE'] : null;
if (IS_DEBUG) {
// $range = "bytes=1000-1999\n2000";
// $range = "bytes=1000-1999,2000";
// $range = "bytes=1000-1999,-2000";
// $range = "bytes=1000-1999,2000-2999";
}
set_time_limit(0);
$transfer = new Transfer($filePath, $mimeType, $range);
if (IS_DEBUG) {
$transfer->setIsLog(true);
}
$transfer->send();download.class.php
/**
* 文件传输,支持断点续传。
* 2g以上超大文件也有效
* @author MoXie
*/
class Transfer {
/**
* 缓冲单元
*/
const BUFF_SIZE = 5120; // 1024 * 5
/**
* 文件地址
* @var
*/
private $filePath;
/**
* 文件大小
* @var Php超大数字 字符串形式描述
*/
private $fileSize;
/**
* 文件类型
* @var
*/
private $mimeType;
/**
* 请求区域(范围)
* @var
*/
private $range;
/**
* 是否写入日志
* @var
*/
private $isLog = false;
/**
*
* @param $filePath 文件路径
* @param $mimeType 文件类型
* @param $range 请求区域(范围)
*/
function __construct($filePath, $mimeType = null, $range = null) {
$this->filePath = $filePath;
$this->fileSize = sprintf('%u', filesize($filePath));
$this->mimeType = ($mimeType != null) ? $mimeType : "application/octet-stream"; // bin
$this->range = trim($range);
}
/**
* 获取文件区域
* @return