使用 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 如何在文件中结束?