2016-02-19 117 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'之前,你可以做任何你需要的来验证用户。请参阅编辑。 –

相关问题