我能用PHP提供MP3文件吗?

12

就像使用php提供图像用于CAPTCHA等用途一样,是否可以使用相同的方法提供音频文件?

我尝试过这个:

<?php

$track = "sometrack.mp3";

if(file_exists($track)) {
    header('Content-type: audio/mpeg');
    header('Content-length: ' . filesize($track));
    header('Content-Disposition: filename="sometrack.mp3"');
    header('X-Pad: avoid browser bug');
    header('Cache-Control: no-cache');
    print file_get_contents($track);
} else {
    echo "no file";
}

我正在使用Safari浏览器,它可以播放MP3文件。当我尝试播放时,Safari会进入正确的模式,我能够看到Quicktime控件几秒钟,然后出现"No Video"(无视频)。

如果你想知道为什么我要这样做,那是因为我正在尝试防止未经授权下载文件。


你应该能够做到 - 不确定为什么不起作用,但你走在正确的路上。尝试使用命令行中的wget/curl命令访问文件的URL,并检查它是否按预期工作。 - Rich Bradshaw
3个回答

16
您的Content-Disposition应该是:
header('Content-Disposition: attachment; filename="sometrack.mp3"');

不确定是否是问题所在。我还建议使用readfile来输出文件:
readfile($rSong);

此外,使用详尽的Content-Type头部和设置Content-Transfer-Encoding也是无妨的。
header("Content-Transfer-Encoding: binary"); 
header("Content-Type: audio/mpeg, audio/x-mpeg, audio/x-mpeg-3, audio/mpeg3"); 

1
这些额外的标头产生了很大的影响!谢谢。虽然我现在已经删除了“附件”,因为我想在浏览器中播放曲目,但是当人们下载曲目时,我将来还需要使用它。非常感谢您的建议。 - gargantuan
请注意,XSendfile(在Apacha和nginx上)可以严重减轻服务器/ php的负载,并仍然使用文档根目录之外的文档。 - Wrikken

1

尝试使用这个类,它支持下载恢复和速度限制。相信我,作为mp3下载网站的所有者,你需要它。


1
根据这里的讨论以及 PHP 4、5、7 和 8 的 PHP 网站上的 readfile(),我得出了以下结论:
if (file_exists($file)) {
  header('Content-Description: File Transfer');
  header("Content-Transfer-Encoding: binary");
  header('Content-Type: audio/mpeg');
  header('Content-Disposition: attachment; filename="'.basename($file).'"');
  header('Expires: 0');
  header('Cache-Control: must-revalidate');
  header('Pragma: public');
  header('Content-Length: '.filesize($file));
  readfile($file);
  exit;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接