PHP readfile不能与Safari一起正常工作
我正在将mp3加载到htmlPHP readfile不能与Safari一起正常工作,php,audio,safari,http-headers,readfile,Php,Audio,Safari,Http Headers,Readfile,我正在将mp3加载到html url可能看起来像,www.website.com/song.php?sid=234234 我已经尝试过多次调整这个文件,但无法找出为什么Safari上会出现这种情况。我的直觉是浏览器处理MP3等的方式,应该在标题中处理 如有任何指导、提示或帮助,将不胜感激 谢谢 更新: 添加了网络,显示它加载了mp3,但第二个请求没有加载? 响应标题: Name Value Server Apache Content-Type audio/mpeg, audio/
url可能看起来像,www.website.com/song.php?sid=234234
我已经尝试过多次调整这个文件,但无法找出为什么Safari上会出现这种情况。我的直觉是浏览器处理MP3等的方式,应该在标题中处理
如有任何指导、提示或帮助,将不胜感激
谢谢
更新:
添加了网络,显示它加载了mp3,但第二个请求没有加载?
响应标题:
Name Value
Server Apache
Content-Type audio/mpeg, audio/x-mpeg, audio/x-mpeg-3, audio/mpeg3
Date Wed, 28 Dec 2016 17:24:48 GMT
Cache-Control no-cache
X-Powered-By PHP/5.3.29
Content-Disposition inline;filename="148_2793d1c49976a3689147634359577ec1aa5619f1.mp3"
Content-Length 834312
Expires 0
Connection Keep-Alive
Content-Transfer-Encoding binary
Accept-Ranges bytes
Keep-Alive timeout=5, max=100
Pragma no-cache
您需要传递多个范围标题,因为它是部分内容:
编辑
请看这里:
您需要为safari定义一些标题,即使是移动版本。您需要传递多个范围标题,因为它是部分内容:
编辑
请看这里:
您需要为safari定义一些标题,即使是移动版也是如此。我之前遇到过这个问题,如果我不记得如何解决这个问题,很抱歉,但这是一个标题问题(这是我能记住的主要部分,我不使用注释添加答案,因为它太长)
试试这个
header( 'Accept-Ranges: bytes');
header("Pragma: public");
header("Expires: 0");
header('Cache-Control: no-cache, no-store');
header('Content-Transfer-Encoding: binary');
header('Content-Disposition: inline; filename="'.$filename.'"');
header('Content-Length: '.$fsize);
header('Content-Type: audio/'.$t);
header('Accept-Ranges: bytes');
header('Connection: Keep-Alive');
header('Content-Range: bytes 0-'.$shortlen.'/'.$fsize);
header('X-Pad: avoid browser bug');
header('Etag: '.$etag);
其中:
$filename = "myaudio.mp3";
$path = 'music/'.$filename;
$fsize = filesize($path);
$shortlen = $fsize - 1;
$fp = fopen($path, 'r');
$etag = md5(serialize(fstat($fp)));
fclose($fp);
$t = "mpeg";
希望这有帮助,但如果我没有错的话,您需要的两个主要标题是“Etag”和“Accept Ranges”。我前一段时间遇到过这个问题,如果我记不清如何解决这个问题,很抱歉,这是一个标题问题(这是我能记住的主要部分,我不使用注释添加答案,因为它太长)
试试这个
header( 'Accept-Ranges: bytes');
header("Pragma: public");
header("Expires: 0");
header('Cache-Control: no-cache, no-store');
header('Content-Transfer-Encoding: binary');
header('Content-Disposition: inline; filename="'.$filename.'"');
header('Content-Length: '.$fsize);
header('Content-Type: audio/'.$t);
header('Accept-Ranges: bytes');
header('Connection: Keep-Alive');
header('Content-Range: bytes 0-'.$shortlen.'/'.$fsize);
header('X-Pad: avoid browser bug');
header('Etag: '.$etag);
其中:
$filename = "myaudio.mp3";
$path = 'music/'.$filename;
$fsize = filesize($path);
$shortlen = $fsize - 1;
$fp = fopen($path, 'r');
$etag = md5(serialize(fstat($fp)));
fclose($fp);
$t = "mpeg";
希望这有帮助,但是如果我没有错的话,您需要的两个主要标题是“Etag”和“Accept Ranges”。如果您在音频标记中没有看到src
属性,那么问题出在HTML中,而不是PHP脚本。它从一开始就不会调用PHP脚本。请检查标头响应…因为“标头('Content type:{$mime_type}');”不会替换值,因为如果我对“{}”没有错的话,单引号在PHP中替换vars中的值是不起作用的。尝试将其更改为标题('Content type:'.$mime_type});如果不起作用,那么,请将网络标题添加到您的问题中(如果我有错误,请纠正我:)@Asfo很好的建议,但不起作用。以下是网络标题:如果在audio标记中没有看到src
属性,那么问题出在HTML中,而不是PHP脚本中。它从一开始就不会调用PHP脚本。请检查标头响应…因为“标头('Content type:{$mime_type}');”不会替换值,因为如果我对“{}”没有错的话,单引号在PHP中替换vars中的值是不起作用的。尝试将其更改为标题('Content type:'.$mime_type});如果不起作用,那么,请将网络标题添加到您的问题中(如果我有错误,请纠正我:)@Asfo很好的建议,但不起作用。以下是网络标题:不适用于我:(我已经更新了帖子以包含网络屏幕截图。但是如果你有兴趣在本地调试它(safari vs chrome)这里有一个例子,我认为您对接受范围的看法是正确的,但我只是还不能让它工作。嗯,您认为我的标题中有过多的内容吗?我看不到响应标题。无论如何,为什么在请求标题上,范围标题有“0-1”?文件大小为1字节?你发布的链接有一个巨大的库来支持这一点。它现在可以工作了,我非常感谢你——我想我还没有弄明白。干杯。只使用标题(“接受范围:0-filesize($file)”);
对我不起作用(在iOS safari中),但该链接对我帮助很大。谢谢!对我不起作用:(我已经更新了帖子,加入了网络截图。但是如果你有兴趣在本地调试它(safari vs chrome)这里有一个例子,我认为您对接受范围的看法是正确的,但我只是还不能让它工作。嗯,您认为我的标题中有过多的内容吗?我看不到响应标题。无论如何,为什么在请求标题上,范围标题有“0-1”?文件大小是1字节?你发布的链接有一个非常棒的库。它现在可以工作了,我非常感谢你——我想我还没有弄明白。干杯。只使用标题(“接受范围:0-filesize($file)”);
对我不起作用(在iOS safari中),但链接帮了我很多。谢谢!