PHP readfile不能与Safari一起正常工作

PHP 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/

我正在将mp3加载到html

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中),但链接帮了我很多。谢谢!