0

我需要允许用户只流式传输它而不下载该文件我该怎么做?另一个问题这个代码我有问题文件先下载然后播放?

<?php $file = isset($_GET['q']) ? dirname(__FILE__) . base64_decode($_GET['q']) : false;
$file = urldecode(str_replace('/', '\\', $file));
$download = isset($_GET['d']) ? $_GET['d'] == 't' ? true : false : false;
if ($file) {
$disabelStr = 'DisableTrackDownload-';
$pattern = '/'.$disabelStr.'/';
$disableDownload = preg_match($pattern,$file);
$isFile = is_file($file);
// check if file exists
if($isFile){
    // Getting headers sent by the client.
    $headers = apache_request_headers();
    if(isset($headers['Connection'])){
        // stream audio files
        header("Content-Type: audio/mpeg");
        header('Content-Length:'.filesize($file));
        header('Content-Disposition: inline; filename="stream.file"');
        header('X-Pad: avoid browser bug');
        header("Cache-Control: no-store, no-cache, must-revalidate");
        header("Expires: -1");
        ob_clean();
        flush();
        readfile($file);
    }else{
        // disable download
        header ("HTTP/1.0 404 Not Found");
    }
    exit;
}
}
?>
4

1 回答 1

4

第 1 部分:一般流式传输。

“MP3 流”不同于 HTTP 下载。正确的流需要流媒体服务器(例如 Shoutcast),并且通常是直播的转码版本或大型音频文件的点播版本,可以立即开始播放,而不是等待整个文件下载。

通过 HTTP 提供 MP3 文件并不构成真正的“流媒体”,即使客户端(如 Winamp、Quicktime Player 等)能够在文件下载之前播放文件。

为此,您不能从 PHP 提供 MP3 流,原因应该很明显(即 PHP 是一个“短命”进程,不适用于长生命周期的请求,例如基于 HTTP 的流)。

您描述的场景是提供 MP3 文件的标准 HTTP 下载,但使用可以立即开始播放的客户端。请注意,由于客户端的工作方式(通常),您无法阻止人们保存下载的文件。

我想您可以限制对已知客户端的访问(通过User-agent标头),但这是邪恶的一个例子。请不要做这样的事情。


第 2 部分:您的代码

您的 PHP 代码使用Content-disposition标头向浏览器提示应将文件下载到文件系统,而不是将 URL 传递给外部程序或插件。删除标题,您会发现一些浏览器会启动 MP3 播放器,但其他浏览器仍会提示用户将文件保存到磁盘(通常是因为用户偏好,或者可能缺少安装的 MP3 播放器)。

此外,请勿使用 HTTP 404 拒绝请求。使用HTTP 403 Forbidden哪个更准确地描述您正在做的事情。

于 2012-07-14T18:42:27.683 回答