1
我試圖從服務器端播放mp3文件到客戶端。客戶端訪問服務器時傳遞一些ID並且服務器返回文件。如何從服務器端流式傳輸mp3文件隱藏?
現在,這是如何工作的?
好吧,在不同的URL上使用Laravel(服務器端)和AngularJS(客戶端),我可以播放歌曲。
但是,如果我收到請求響應,我可以下載歌曲。
那麼,什麼是最好的工作方式,以便用戶不會看到信息?
我試圖從服務器端播放mp3文件到客戶端。客戶端訪問服務器時傳遞一些ID並且服務器返回文件。如何從服務器端流式傳輸mp3文件隱藏?
現在,這是如何工作的?
好吧,在不同的URL上使用Laravel(服務器端)和AngularJS(客戶端),我可以播放歌曲。
但是,如果我收到請求響應,我可以下載歌曲。
那麼,什麼是最好的工作方式,以便用戶不會看到信息?
我會寫一些文件代理。
您必須將文件移出公共區域。 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);
});
嘿感謝,我會檢查,這個下午。 – Pablo
對!後端是更改標題並打開文件。無論如何複製該鏈接並從瀏覽器訪問我可以下載de文件,因爲我的後端正在返回「文件內容」。 – Pablo
在調用'fileProxyAction'之前,你可以做任何你需要的來驗證用戶。請參閱編輯。 –