使用 PHP 下载 mp3 文件
Downloading mp3 files using PHP
我 运行 一个允许用户下载 mp3 文件(我自己创建的)的网站。我使用 PHP 使用 content-disposition header 标签中的附件选项将 mp3 直接传送给用户(沿途重命名文件)到他们的下载区域。除了下载的 mp3 文件的所有 ID3 标签(和封面插图)被剥离外,一切正常
我已经为服务器上的所有文件标记并附加了插图。
我可以将一个简单的 link 放到网页上的文件中,然后右键单击 - 另存为,文件将保存为完整的标签。
这是 php(我肯定已经在这里看到很多次了)
if ( file_exists($file) ) {
header("Pragma: public");
header('Expires: '.gmdate('D, d M Y H:i:s').' GMT');
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header("Content-Type: audio/mpeg");
header('Content-Disposition: attachment; filename="'.$tname.'"');
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".@filesize($file));
set_time_limit(0);
@readfile($file) OR die("<html><body OnLoad=\"javascript: alert('Unable to read file!');history.back();\" bgcolor=\"#F0F0F0\"></body></html>");
exit;
} else {
die("<html><body OnLoad=\"javascript: alert('File not found!');history.back();\" bgcolor=\"#F0F0F0\"></body></html>");
}
有关 mp3 标签丢失原因的任何线索
PHP 不知道也不关心您的 ID3 标签。如图所示,您的代码实际上不可能在不损坏文件的情况下删除标签 。
但是,某些版本的 ID3 标签存储在文件末尾。如果这是缺失的,那么您可能会在 PHP 和您的服务器配置之间的某处遇到超时或缓冲区大小限制。
关上前门
所以我使用十六进制编辑器打开下载的 mp3,与标签显示正确的版本进行比较。
我下载的文件(使用 PHP)在文件的开头添加了一些文本,我很快认出这段文本是我留下的调试回显,所以我将它们注释掉,然后在开头留下了 3 个神秘字符最终成为嵌入在 php 文件中 'PHP' 标记之前的字节顺序标记三元组。这在使用普通 html 编辑器时是不可见的,我不得不用十六进制编辑器删除它们。现在可以了。
我知道我在这里做错了什么。回显文本和源文件 BOM 如何在文件中结束?
我 运行 一个允许用户下载 mp3 文件(我自己创建的)的网站。我使用 PHP 使用 content-disposition header 标签中的附件选项将 mp3 直接传送给用户(沿途重命名文件)到他们的下载区域。除了下载的 mp3 文件的所有 ID3 标签(和封面插图)被剥离外,一切正常
我已经为服务器上的所有文件标记并附加了插图。 我可以将一个简单的 link 放到网页上的文件中,然后右键单击 - 另存为,文件将保存为完整的标签。
这是 php(我肯定已经在这里看到很多次了)
if ( file_exists($file) ) {
header("Pragma: public");
header('Expires: '.gmdate('D, d M Y H:i:s').' GMT');
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header("Content-Type: audio/mpeg");
header('Content-Disposition: attachment; filename="'.$tname.'"');
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".@filesize($file));
set_time_limit(0);
@readfile($file) OR die("<html><body OnLoad=\"javascript: alert('Unable to read file!');history.back();\" bgcolor=\"#F0F0F0\"></body></html>");
exit;
} else {
die("<html><body OnLoad=\"javascript: alert('File not found!');history.back();\" bgcolor=\"#F0F0F0\"></body></html>");
}
有关 mp3 标签丢失原因的任何线索
PHP 不知道也不关心您的 ID3 标签。如图所示,您的代码实际上不可能在不损坏文件的情况下删除标签 。
但是,某些版本的 ID3 标签存储在文件末尾。如果这是缺失的,那么您可能会在 PHP 和您的服务器配置之间的某处遇到超时或缓冲区大小限制。
关上前门
所以我使用十六进制编辑器打开下载的 mp3,与标签显示正确的版本进行比较。 我下载的文件(使用 PHP)在文件的开头添加了一些文本,我很快认出这段文本是我留下的调试回显,所以我将它们注释掉,然后在开头留下了 3 个神秘字符最终成为嵌入在 php 文件中 'PHP' 标记之前的字节顺序标记三元组。这在使用普通 html 编辑器时是不可见的,我不得不用十六进制编辑器删除它们。现在可以了。
我知道我在这里做错了什么。回显文本和源文件 BOM 如何在文件中结束?