我运行一个网站,允许用户下载(我自己创建的)mp3文件。我使用PHP使用content-disposition header标签中的附件选项将mp3直接发送给用户(沿途重命名文件)到他们的下载区域。一切正常,只是下载的mp3文件被剥夺了所有的ID3标签(和封面图片)
我已将标记和附加图片附加到服务器上的所有文件中。 我可以在网页上放置一个简单的文件链接,然后右键单击 - 另存为,文件将保存标签完整。
这是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标签丢失的任何线索
答案 0 :(得分:1)
PHP不知道或不关心您的ID3标签。如图所示,您的代码实际上不可能删除标记而不会损坏文件。
但是,某些版本的ID3标记存储在文件的末尾。如果这是缺少的,那么您可能会在PHP和服务器配置之间的某处达到超时或缓冲区大小限制。
答案 1 :(得分:0)
关闭前门
所以我使用十六进制编辑器打开下载的mp3,与正确显示标签的版本进行比较。 我下载的文件(使用PHP)在文件的开头添加了一些文本,我很快就认出了这个文本作为调试回显而已经离开了,所以我评论了它们然后在开始时留下3个神秘字符结束作为字节顺序标记三元组,它们嵌入在PHP文件之前的PHP文件中。标签。使用普通的html编辑器时这是不可见的,我不得不用十六进制编辑器删除它们。现在它有效。
我知道我在这里做错了什么。 echo文本和源文件BOM如何在文件中结束?