如何在下载文件之前验证用户?

pow*_*boy 2 php

例如,如果用户想要下载/webroot/files/bigimage.jpg,则会给他们一个URL www.domain.com/download.php?filename=bigimage.jpg.然后,

  1. 如何防止未经身份验证的用户访问bigimage.jpg文件?
  2. 如果经过身份验证的用户访问该URL,我想触发浏览器的下载行为(例如,在IE中,显示带有"打开","保存"和"取消"按钮的对话框),而不是在浏览器中显示图像.这该怎么做?

编辑:让问题更清晰.

我正在使用LAMP堆栈.对于Q1,我不问如何进行身份验证,我问如何阻止用户直接访问该文件.此外,读取整个文件的内容并回显它们是资源广泛的.有更好的解决方案吗?

Nig*_*gel 5

第一步,将.htaccess文件放在文件夹中,图像上显示"全部拒绝".这将阻止任何人访问该文件,即使他们知道该文件夹.

然后,你编写使用像这样的PHP函数

$file = 'path/to/folder' . $filename;
//Make sure you check that $filename does not contain ".." for security
if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    exit;
} else {
    //Show error message
}
Run Code Online (Sandbox Code Playgroud)

您应该检查会话变量以查看用户是否已登录并具有可以下载此角色的角色.此代码也将强制下载图像而不是显示它.