使用jPlayer流保护媒体(位于httpdocs之外)

时间:2012-03-10 13:51:46

标签: php streaming jplayer

我已经将一些示例mp3文件上传到httpdocs之外的目录,我确保通过正确配置open_basedir并测试该目录是否正常工作,PHP可以访问它。

我想要做的是通过PHP文件传输这些文件,因为未经过身份验证的用户永远不应该访问这些文件。我目前正在使用jPlayer,并期望setMedia函数看起来应该类似于:

$("#jquery_jplayer").jPlayer("setMedia", { mp3: "stream.php?track=" + id + ".mp3" });

我已尝试在stream.php中设置内容标题等,目前看起来像这样:

$filePath = "../song_files/mp3/";
$fileName = "$_GET[track].mp3";

header("Content-Type: audio/mpeg");
header('Content-Disposition: attachment; filename="'.$fileName.'"');

getFile($filePath + $fileName);

如果我直接加载此页面,mp3文件下载并播放正常,但是当我使用上面的javascript时,jPlayer不播放该曲目。

我看过这篇文章(Streaming an MP3 on stdout to Jplayer using PHP),看起来用户正试图达到我想要的效果,但在测试解决方案后我一直遇到问题,我得到的只是“CURL”失败”。

我可以使用任何不同的方法来实现这一目标。指出我正确的方向将非常感激。

1 个答案:

答案 0 :(得分:0)

在搜索了一些之后,我找到了一个工作正常的解决方案。我使用了类似主题的代码(PHP to protect PDF and DOC

我将放置此处使用的代码以帮助正确回答问题:

//check users is loged in and valid for download if not redirect them out
// YOU NEED TO ADD CODE HERE FOR THAT CHECK
// array of support file types for download script and there mimetype
$mimeTypes = array(
    'doc' => 'application/msword',
    'pdf' => 'application/pdf',
);
// set the file here (best of using a $_GET[])
$file = "../documents/file.doc";

// gets the extension of the file to be loaded for searching array above
$ext = explode('.', $file);
$ext = end($ext);

// gets the file name to send to the browser to force download of file
$fileName = explode("/", $file);
$fileName = end($fileName);

// opens the file for reading and sends headers to browser
$fp = fopen($file,"r") ;
header("Content-Type: ".$mimeTypes[$ext]);
header('Content-Disposition: attachment; filename="'.$fileName.'"');

// reads file and send the raw code to browser     
while (! feof($fp)) {
    $buff = fread($fp,4096);
    echo $buff;
}
// closes file after whe have finished reading it
fclose($fp);
</code></pre>