我正在创建一个带有web界面的文件存储库。用户将能够登录(简单的PHP授权系统)并浏览存储在服务器上的文件。每个目录都有一个名称,它决定了它属于哪个用户。
我正在努力保护整个东西——我不能简单地把所有文件扔到文档根目录,因为每个人都能访问它们。与此问题相关的所有答案都表明,所有私有和敏感数据都应该放在文档根目录之外。我就是这么做的,但是现在我找不到在用户登录时显示这些文件的方法。
我该如何处理这个问题?将它们作为blob存储在数据库中不是一个好主意,因为每个文件都超过1.5G。事实上,这些视频文件将使用javascript插件播放,这一点也很重要——它们需要用户的浏览器直接访问。
对于有同样问题的人:我照谢里夫的回答做了。您需要安装mod_xsendfile并添加
XSendFile On
XSendFilePath "/var/www/"
到您的apache配置文件的<Directory>
部分。当然,修改路径以满足您的需要。然后创建一个PHP文件来处理这些请求。下面是一个类似php的伪代码示例:
$file = $_GET["file"];
if (user_logged_in() && user_allowed_to_download($file)){
$absoluteFilePath = "/var/www/".$file;
header("X-Sendfile: ".$absoluteFilePath);
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=".$file);
}
然后你可以使用jwplayer, VLC等,像这样:
<div class="embed_vlc_wrapper">
<embed type="application/x-vlc-plugin" pluginspage="http://www.videolan.org" version="VideoLAN.VLCPlugin.2"
width="500"
height="500"
version="VideoLAN.VLCPlugin.2"
target="http://localhost/xsend.php?file=1.mp4"
pluginspage="http://www.videolan.org"
/>
</div>
如果您希望用户通过PHP进行身份验证并访问文档根目录之外的文件,这是可以的。只需进行正常的身份验证,然后您可以使用X-Sendfile
头让您的web服务器从文件系统上的任何位置提供文件。关于如何启用sendfile,请参阅web服务器的文档:例如Apache httpd, Nginx
基本思想是…
if (isset($_SESSION['user_authenticated'])) { // or however you verify the user
header('X-Sendfile: ', $pathToFileForDownload); // your web server will do the rest
}