我有一个索引脚本,它在文档根目录中执行:
/var/www/mywebsite/protected-folder/index.php
现在我有一个目录OUTSIDE文件根目录,其中包含一个包含文件的子目录列表:
/var/www/uploads/LIST OF SUBDIRECTORIES/file
当uploads文件夹在文档根目录中时,我使用了这段代码:
<?php
$dir = "/var/www/uploads";
$list = scandir($dir); /* This function sorts dirs */
$list = array_diff($list,array(".","..","index.php"));
echo "<ol>";
foreach ($list as $file)
{
if (!is_dir($file)) echo "<li><a href='https://mysite.ca/protected-folder/uploads/$file'>$file</a></li>\n";
}
echo "</ol>";
?>
但是,除非已登录并且有权访问此脚本,否则此文件夹必须是公共文件夹。
如何创建指向文档根目录之外的文件夹的链接,如果单击该链接,则显示该目录中的文件?
编辑:为了使我的问题更加明确,uploads文件夹将包含两层子目录,这些子目录将是一个未知数字:/var/www/uploads/UNKNOWN LIST OF SUBDIRECTORY LEVEL 1/UNKNOWN SUBDIRECTORIES LEVEL 2/ALL FILES (file can be any file type)
之前的方法是使用apache索引来允许用户横穿子目录。这需要是安全的,以防止直接URL访问,所以这就是我希望它工作的方式:
列出所有第一个子目录链接(指向所有子目录级别1的链接)
然后,在列表中单击链接后,所有子目录级别2文件夹位于子目录级别1
最后,如果单击该链接(子目录2),则显示子目录2中的所有文件
希望能够解决问题
答案 0 :(得分:0)
您所拥有的代码并不关心目录是在文档根目录内部还是外部。只需链接到PHP文件即可检索文件本身(而不是文件上传的链接,因为它不可用)。要检索文件,您只需使用脚本获取内容并输出即可。
这样的事情:
<?php
$path = '/var/www/uploads';
$file = do_something_to_make_this_safe($_POST['file_to_retrieve']);
$type = mime_content_type( $path . '/' . $file );
$contents = file_get_contents($path . '/' . $file);
header('Content-Type: ' . $type);
header('Content-Disposition: attachment;filename=' . $file);
print $contents;
?>
请注意,您需要确保有人不会使用..
之类的内容污染文件路径,以尝试访问禁止的文件。 (因此do_something_to_make_this_safe()
)