从我之前的讨论中,我带走了这样一个事实,即如果将文件放在根目录下,它们是安全的。我和处理此事的人谈过,他说如果我们阻止公众访问,那么上传内容的用户就不能下载或查看他们的文件。给你一个我想做的例子:
如果我,一个网站的成员上传一个word文件到我的帐户,那么我应该能够回来下载它。但是由于文件夹正在阻止访问,那么如何下载文件呢?
通常情况下,您想要下载的文件应该在文档根目录中或更深的地方。但是,如果你只是想让文件在某些时候可下载(例如,你想先检查用户凭据,或者在数据库中计算下载),你可以编写一个下载脚本。最简单的形式是:
<?php
header('Content-Disposition: attachment;filename=hello.txt');
readfile('/path/to/file.txt');
?>
注意,有一个更好的方法使用一个特殊的Apache模块xsendfile
。有了它,你可以这样做:
<?php
header('Content-Disposition: attachment;filename=hello.txt');
header('X-Sendfile: /path/to/file.txt');
?>
Apache将看到第二个头,剥离它并发送file.txt的内容。好处是,您的资源密集型PHP脚本将已经停止,您将不会遇到任何类型的PHP时间或内存限制。
显然,你想要下载的文件应该存储在根目录或"after"目录下。通常,您不希望其他人直接访问的文件应该存储在根目录下。这是因为如果你只需要包含这些文件,你可以很容易地回到根目录并使用include()
或require()
获得它们,而它们被用户隐藏,因为你的地址将显示为www.site.com/index.php
。
需要公共访问的文件(例如:download)不能存储在根目录下
可以直接从PHP脚本传递文件给用户。你需要fpassthru函数。但这种解决方案并不完美,而且会导致问题。我更倾向于将应该可下载的文件放在公共访问目录(文档根目录或子目录)的某个地方。或者您可以从子域提供它们(甚至更好)。