使用PHP下载mp3文件

时间:2018-02-16 15:08:05

标签: php tags mp3

我运行一个网站,允许用户下载(我自己创建的)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标签丢失的任何线索

2 个答案:

答案 0 :(得分:1)

PHP不知道或不关心您的ID3标签。如图所示,您的代码实际上不可能删除标记而不会损坏文件

但是,某些版本的ID3标记存储在文件的末尾。如果这是缺少的,那么您可能会在PHP和服务器配置之间的某处达到超时或缓冲区大小限制。

答案 1 :(得分:0)

关闭前门

所以我使用十六进制编辑器打开下载的mp3,与正确显示标签的版本进行比较。 我下载的文件(使用PHP)在文件的开头添加了一些文本,我很快就认出了这个文本作为调试回显而已经离开了,所以我评论了它们然后在开始时留下3个神秘字符结束作为字节顺序标记三元组,它们嵌入在PHP文件之前的PHP文件中。标签。使用普通的html编辑器时这是不可见的,我不得不用十六进制编辑器删除它们。现在它有效。

我知道我在这里做错了什么。 echo文本和源文件BOM如何在文件中结束?