2016-02-19 120 views
1

我試圖從服務器端播放mp3文件到客戶端。客戶端訪問服務器時傳遞一些ID並且服務器返回文件。如何從服務器端流式傳輸mp3文件隱藏?

現在,這是如何工作的?

好吧,在不同的URL上使用Laravel(服務器端)和AngularJS(客戶端),我可以播放歌曲。

但是,如果我收到請求響應,我可以下載歌曲。

那麼,什麼是最好的工作方式,以便用戶不會看到信息?

回答

1

我會寫一些文件代理。

您必須將文件移出公共區域。 F.比頁面根目錄高一級。所以不可能直接獲取數據。 然後,您需要一個服務器端腳本,獲取數據並將其返回所需的標題。

下面是一個例子(純PHP):

/** 
* @param string $file_name 
* @param string $mime 
* @param bool $download 
*/ 
public function fileProxyAction($file_name, $mime, $download = false) { 

    if(basename($file_name) != $file_name) return 'Filename not valid!'; 

    $path = '... your path goes here'; 
    $file = $path.$file_name; 
    if (!(file_exists($file) && is_readable($file))) return 'The file "'.$file_name.'" could not be found!'; 


    ob_clean(); 

    if($download === false) { 

     header('Content-type: '.$mime); 
     header('Content-length: '.filesize($file)); 

     $open = @ fopen($file, 'rb'); 
     if ($open) { 
      fpassthru($open); 
      exit; 
     } 

    } else { 

     // download 
     $path_parts = pathinfo($file); 
     header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\""); 
     header("Content-type: application/octet-stream"); 
     header("Content-length: " . filesize($file)); 
     header("Content-Disposition: filename=\"".$path_parts["basename"]."\""); 
     header("Cache-control: private"); // open files directly 
     readfile($file); 
     die; 
    } 

} 

Laravel具有優異Built-In-Filesystem。一探究竟。我相信你可以用它來優化我的方法。

編輯

如果您需要檢查令牌或東西,你不應該直接由路由器調用fileProxyAction。相反,讓您的路由器的呼叫,檢查令牌或什麼都你使用的方法;)

例(僞代碼):

Route::get('/mp3/{id}/{token}', function($id, $token) { 
    if($token !== Session::get('token')) return App::abort(401); 
    $name = Mp3::findOrFail($id)->name; 
    $mime = Mp3::findOrFail($id)->mime; 

    return $this->fileProxyAction($name, $mime); 
}); 
+0

嘿感謝,我會檢查,這個下午。 – Pablo

+0

對!後端是更改標題並打開文件。無論如何複製該鏈接並從瀏覽器訪問我可以下載de文件,因爲我的後端正在返回「文件內容」。 – Pablo

+0

在調用'fileProxyAction'之前,你可以做任何你需要的來驗證用戶。請參閱編輯。 –

相關問題