如何从服务器端流式传输mp3文件隐藏?
问题描述:
我试图从服务器端播放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'之前,你可以做任何你需要的来验证用户。请参阅编辑。 –