我正在开发一个应用程序,以便在Web浏览器中浏览Windows文件系统。这最初被设想为允许我的妻子查看存储在连接到运行XAMPP的网络计算机的外部硬盘驱动器上的照片的解决方案,从而减少安装任何软件的需要。我继续使用各种技术来观看电影,浏览音乐等来提供内容。哇噢!
使用httpd.conf(Apache Config)中的以下内容访问文件系统没有问题:
<Directory "H:/">
Require all granted
Allow from all
RewriteEngine On
RewriteOptions Inherit
</Directory>
Alias /ExternalDrive "H:/"
最初,我使用URL中的查询字符串创建了一个文件夹参数:
index.php?q1=Pictures
然后创建$ path变量:
if (isset($_GET['q1'])) {
$q1=($_GET['q1']);
$path=$q1."/";
}
然后将$ path变量输入scan_dir:
$scan_dir="H:/$path";
$files_or_folders = scandir($scan_dir);
然后遍历结果,将$ file_or_folder变量与一些额外的逻辑(未包含)更改为文件链接或文件夹链接:
foreach($files_or_folders as $key => $file_or_folder){
// if files
// display pictures or other content
<a href="<?= $file; ?>"><?= $file ?></a>
// if folders
// display a link to the folder
<a href="index.php<?= $query."=".$folder; ?>"><?= $folder ?></a>
}
它工作得很好,但是当文件或文件夹有几个层次时,查询字符串变得非常难看,例如:
index.php?q1=level_A&q2=level_B&q3=level_C
并且解析文件路径所需的代码更糟糕:
if (isset($_GET['q1']) && isset($_GET['q2']) && !isset($_GET['q3'])){
$q1=($_GET['q1']);
$q2=($_GET['q2']);
$q3=($_GET['q3']);
$path=$q1."/".$q2."/".$q3;
$query="?q1=$q1&q2=$q2&q3";
}
我认为使用.htaccess重定向请求不是以这种方式获取文件路径,而是更优雅。因此,我修改了代码,以便将“/ level_A / level_B / level_C”重定向到index.php,并以这种方式创建要提供给scan_dir()的路径信息:
#get uri (everything after www root)
$request = $_SERVER['REQUEST_URI'];
#explode the path by '/'
$folders = explode("/", $request);
ob_start();
#loop through the results
foreach ($folders as $folder) {
echo $folder;
echo "/";
}
#save ob results in variable
$path = ob_get_clean();
所以,文件夹链接现在看起来像这样:
<a href="<?= $path.$folder ?>">$folder/a>
这很有效,但只有两个层次。在第三级,重复第一个文件夹。换句话说,诸如“level_A / level_B / level_C /”的链接被发送到浏览器作为“level_A / level_A / level_B / level_C /”。我错过了一些东西,可能很简单,但我找不到它。
提前感谢任何愿意解决我复杂问题的人。