我想从 web 根目录上方的文件夹中下载文件。假设我想获取此文件:
/var/pdfs/test.pdf
我的代码是:
$name = "test.pdf";
$url = "/var/pdfs/" . $name;
if (file_exists($url)) {
header("Content-Type: application/pdf");
header("Content-Transfer-Encoding: Binary");
header("Content-disposition: attachment; filename='" . basename($url) . "'");
readfile($url);
} else {
echo "Not found: $url";
}
问题是我总是得到Not found: $url
回声。
我的文件具有读取权限:
thecrafter@vps136166:/var/pdfs$ ls -la
total 6484
drwxr--r-- 2 thecrafter root 4096 Jul 7 00:19 .
drwxr-xr-x 13 root root 4096 Jul 7 00:16 ..
-rw-r--r-- 1 thecrafter thecrafter 6629018 Jul 7 00:18 test.pdf
和目录也是:
thecrafter@vps136166:/var$ ls -la | grep pdfs
drwxr--r-- 2 thecrafter root 4096 Jul 7 00:19 pdfs
我错过了什么吗?问题出在哪里?
编辑 1
Krzysztof Duszczyk指出,如果我授予目录pdfs
执行权限,问题就解决了。事实上,我给了它755
它正在工作。知道为什么会这样吗?
问题(不是在这种情况下,但我把它留给别人)
如果您知道该文件确实存在于磁盘上,则您的file_exists()
可能被旨在保护/var/pdfs/
中的文件免受未经授权的访问的安全措施阻止。 这是来自file_exists上的文档:
警告:此函数对于由于以下原因而无法访问的文件返回 FALSE 安全模式限制。但是,如果 他们位于safe_mode_include_dir。
解决方案(同样不是在这种情况下,但可以帮助类似的症状)
您希望将目录添加到safe_mode_include_dir
设置。在php.ini
中找到该设置,取消注释,然后添加目录:
safe_mode_include_dir = /var/pdfs/
如果这仍然不起作用,您可能还需要将目录添加到 PHP 包含路径中,方法是在 php.ini
中设置include_path
,或在脚本顶部设置,如下所示:
$path = '/var/pdfs'
set_include_path(get_include_path() . PATH_SEPARATOR . $path);
请注意,PHP 删除了版本 5.4
的safe mode
设置,因此如果您有最近的 PHP 安装,您的问题可能在其他地方。