我正在创建一个带有Web界面的文件存储库。用户将能够登录(简单的PHP授权系统)并浏览存储在服务器上的文件。每个目录都有一个名称,用于确定它所属的用户。
我正在努力保护整个事情 - 我不能简单地将所有文件都放到文档根目录中,因为每个人都可以访问它们。与此问题相关的所有答案都表明,所有私有和敏感数据都应放在文档根目录之外。 这就是我所做的,但现在我无法找到一种方法在用户登录时向用户显示这些文件。
我该如何处理这个问题?将它们作为BLOB存储在数据库中是一个坏主意,因为每个文件都超过1.5G。 事实上这些是使用javascript插件播放的视频文件也很重要 - 它们需要由用户的浏览器直接访问。
更新
对于遇到同样问题的人: 我在答案中建议Sherif做了。您需要安装mod_xsendfile并添加
XSendFile On
XSendFilePath "/var/www/"
到<Directory>
部分的apache配置文件。当然,修改路径以满足您的需求。然后创建一个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>
答案 0 :(得分:1)
如果您希望用户通过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
}