2012-07-14 85 views
1

我需要允許用戶流式傳輸它只有該文件沒有下載我該怎麼做? 另一個問題,這個代碼我有問題的文件首先下載然後播放?PHP Stream mp3文件

<?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

Part 1:Streaming in general。

「MP3流」與HTTP下載不同。合適的流需要流媒體服務器(例如Shoutcast),並且通常是現場直播的轉碼版本或大音頻文件的按需版本,其中播放可以立即開始,而不是等待整個文件下載。

即使客戶端(如Winamp,Quicktime Player等)能夠在下載之前播放文件,通過HTTP服務MP3文件也不構成真正的「流式傳輸」。

爲此,由於原因應該是明顯的(即PHP是一個「短命」進程,並不適用於長時間請求,如通過HTTP的流),您無法爲PHP提供MP3流。

您描述的場景是提供MP3文件的標準HTTP下載,但使用可立即開始播放的客戶端。請注意,由於客戶的工作方式(一般而言),您無法阻止用戶保存下載的文件。

我想你可以限制訪問已知的客戶端(通過User-agent標題),但這是一個邪惡的例子。請不要做這樣的事情。


第2部分:您的代碼

您的PHP代碼使用Content-disposition頭提示該文件應被下載到文件系統,而不是傳遞給外部程序或插件的網址瀏覽器。刪除標題,你會發現一些瀏覽器將啓動一個MP3播放器,但其他人仍然會提示用戶將文件保存到磁盤(通常是因爲用戶的喜好,或者可能缺少安裝的MP3播放器)。

此外,請勿使用HTTP 404拒絕請求。使用HTTP 403 Forbidden更準確地描述你在做什麼。