php infinity,php – mp3的HTML5音频持续时间始终为Infinity

我终于找到了我的解决方案

here.我不得不稍微更改代码,这里是更改.现在,如果我可以完全支持多个范围,它将是完整的.

(我正在分享这个,因为我看到的都是不完整的答案.希望它也能帮助别人.)

$file = $basePath . $media->getFileName();

$fileSize = filesize($file);

$fileTime = date('r', filemtime($file));

$fileHandle = fopen($file, 'r');

$rangeFrom = 0;

$rangeTo = $fileSize - 1;

$etag = md5(serialize(fstat($fileHandle)));

$cacheExpires = new \DateTime();

if (isset($_SERVER['HTTP_RANGE'])) {

if (!preg_match('/^bytes=\d*-\d*(,\d*-\d*)*$/i', $_SERVER['HTTP_RANGE'])) {

$statusCode = 416;

} else {

$ranges = explode(',', substr($_SERVER['HTTP_RANGE'], 6));

foreach ($ranges as $range) {

$parts = explode('-', $range);

$rangeFrom = intval($parts[0]); // If this is empty, this should be 0.

$rangeTo = intval($parts[1]); // If this is empty or greater than than filelength - 1, this should be filelength - 1.

if (empty($rangeTo)) $rangeTo = $fileSize - 1;

if (($rangeFrom > $rangeTo) || ($rangeTo > $fileSize - 1)) {

$statusCode = 416;

} else {

$statusCode = 206;

}

}

}

} else {

$statusCode = 200;

}

if ($statusCode == 416) {

$response = $this->getResponse();

$response->setStatusCode(416); // HTTP/1.1 416 Requested Range Not Satisfiable

$response->addHeaderLine('Content-Range', "bytes */{$fileSize}"); // Required in 416.

} else {

fseek($fileHandle, $rangeFrom);

set_time_limit(0); // try to disable time limit

$response = new Stream();

$response->setStream($fileHandle);

$response->setStatusCode($statusCode);

$response->setStreamName(basename($file));

$headers = new Headers();

$headers->addHeaders(array(

'Pragma' => 'public',

'Expires' => $cacheExpires->format('Y/m/d H:i:s'),

'Cache-Control' => 'no-cache',

'Accept-Ranges' => 'bytes',

'Content-Description' => 'File Transfer',

'Content-Transfer-Encoding' => 'binary',

'Content-Disposition' => 'attachment; filename="' . basename($file) .'"',

'Content-Type' => 'audio/mpeg, audio/x-mpeg, audio/x-mpeg-3, audio/mpeg3', // $media->getFileType(),

'Content-Length' => $fileSize,

'Last-Modified' => $fileTime,

'Etag' => $etag,

'X-Pad' => 'avoid browser bug',

));

if ($statusCode == 206) {

$headers->addHeaderLine('Content-Range', "bytes {$rangeFrom}-{$rangeTo}/{$fileSize}");

}

$response->setHeaders($headers);

}

return $response;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值