0

我有一个在文档根目录内执行的索引脚本:

/var/www/mywebsite/protected-folder/index.php

现在我在文档根目录之外有一个目录,其中包含一个包含文件的子目录列表:

/var/www/uploads/LIST OF SUBDIRECTORIES/file

当上传文件夹位于文档根目录中时,我使用了以下代码:

<?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>";
?>

但是,除非登录并有权访问此脚本,否则此文件夹需要对公共私有。

如何创建指向文档根目录之外的文件夹的链接,如果单击该链接,则显示该目录中的文件?

编辑:为了让我的问题更清楚,上传文件夹将有两层子目录,这些子目录将是一个未知数:/var/www/uploads/UNKNOWN LIST OF SUBDIRECTORY LEVEL 1/UNKNOWN SUBDIRECTORIES LEVEL 2/ALL FILES (file can be any file type)

以前这样做的方法是使用 apache 索引来允许用户横向浏览子目录。这需要安全以防止直接 url 访问,所以这就是我希望它的工作方式:

  1. 列出所有第一个子目录链接(链接到所有子目录级别 1)

  2. 然后,一旦单击链接,列出子目录级别 1 中的所有子目录级别 2 文件夹

  3. 最后,如果单击该链接(子目录 2),则显示子目录 2 中的所有文件

希望这能说明问题

4

1 回答 1

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()

于 2014-02-10T19:48:47.197 回答