【发布时间】:2012-03-26 12:39:26
【问题描述】:
我正在尝试通过 PHP 脚本发送我的 mp3 文件,以便在 HTML 中隐藏文件的路径。一切正常,除了进入 mp3 chrome 的一半给我一个 GET [URL] 错误。 mp3 的其余部分只是空白。音频标签认为它仍在读取文件,但没有声音。
这就是我从 php 发送 mp3 文件的方式:
if (file_exists($filename)) {
header("Content-Transfer-Encoding: binary");
header("Content-Type: audio/mpeg");
header('Content-length: ' . filesize($filename));
header('Content-Disposition: inline; filename="' . $filename . '"');
header('X-Pad: avoid browser bug');
header('Cache-Control: no-cache');
readfile($filename);
exit;
}
else {
header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found', true, 404);
echo "no file";
}
编辑:我添加了 Etag 标头。它似乎让事情变得更好。问题仍然存在,但不那么频繁。 :-/
Edit2:我注意到发送到我的 PHP 文件的请求标头与直接发送到 mp3 文件的标头不同。实际上有一个 HTTP_RANGE 请求发送到 mp3 文件,但是当我尝试从 PHP 获取内容时,这个范围请求丢失了。 (这是在 Chrome 中)。知道为什么会这样吗?
【问题讨论】:
-
您的脚本不支持范围,chrome 中的 HTML 5 标签可能会请求范围。使您的脚本支持范围或尝试使用较小的文件。另请参阅:Parsing HTTP_RANGE header in PHP.
-
我的文件不是很大。平均大小小于 10MB。最大的可能是 30MB。默认内容范围是多少?我可以将其设置为 50 MB 之类的吗?
-
@hakre,这应该是一个答案。
-
@hakre,经过一番挖掘后,我认为 Range 问题不是问题,因为当我收到来自 html5 音频的请求时未设置 isset($_SERVER['HTTP_RANGE'])标签。还有其他想法吗?
-
知道如何浏览浏览器检查器的人仍然可以使用该路径。不是说它毫无意义,但你并没有真正“隐藏”这样的事情。
标签: php mp3 html5-audio