• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PHPでディレクトリーとそのサブディレクトリー表示)

PHPでディレクトリとサブディレクトリの表示方法

このQ&Aのポイント
  • PHPを使用してディレクトリとそのサブディレクトリの中のファイルを表示する方法について教えてください。
  • 表示したファイルにはダウンロード用のリンクも付け加えたいです。
  • ウェブサイトのフォルダ構造には/projects/website/uploaded/があり、サブフォルダは/projects/website/uploaded/(ユーザ名)/(フォーム番号)/です。

質問者が選んだベストアンサー

  • ベストアンサー
  • luka3
  • ベストアンサー率72% (424/583)
回答No.3

やりたいことはこうですかね。 function getDirContents($diskdir, $dispdir) {  if (is_dir($diskdir)) {   echo '<strong>'.basename($diskdir).'</strong>';   if ($dh = opendir($diskdir)) {    echo '<ul>';    while (($file = readdir($dh)) !== false) {     if ($file == '.' || $file == '..' || substr($file,0,1)=='.') {} else {      echo '<li>';      if (is_dir($diskdir.'/'.$file)) {       getDirContents($diskdir.'/'.$file, $dispdir.'/'.$file);      } else {       echo '<a href="'.$dispdir.'/'.$file.'">'.$file.'</a>';      }      echo '</li>';     }    }    echo '</ul>';    closedir($dh);   }  }  return false; } getDirContents($_SERVER['DOCUMENT_ROOT'].'/projects/website/uploaded/'.$_GET['user'], '/projects/website/uploaded/'.$_GET['user']); 元のソースで良くないのはここ ≫$path1=$basedir.'/'.basename($dir); basenameは最後のフォルダ名しか返しませんから途中が抜けてしまうんじゃないでしょうか。 しかもグローバル変数の$basedirで解決しようとするのでよけい混乱する、と。

2B2B
質問者

お礼

ありがとうございます。たいへん助かりました。

その他の回答 (2)

  • Dags
  • ベストアンサー率78% (11/14)
回答No.2

$dirがフルパス情報持ってるので、無駄な情報を削除すれば動作しますよ。 動作確認しました。

2B2B
質問者

お礼

ご回答ありがとうございます。ディレクトリーの表示は既に動作していたが、URLが正しくありませんでした。

回答No.1

何がどうできないのかが、ちょっと不明ですが、 > ファイルであればダウンロード用のリンクを付け加えたいと思いますが、ここで嵌ってしまっています。 ここの部分については、 echo '<a href="'.$basedir.$path1.'/'.$file.'">'.$file.'</a>'; ですね。PEARライブラリのPEAR/HTTP_Downloadを使うといいと思います。ファイル形式とかの心配が要りませんので。 http://pear.php.net/manual/ja/package.http.http-download.php ただこのコードそのまま使うにはあまりにも危険ですね。「ディレクトリトラバーサル」という脆弱性がありますよ。URLに?user=../../../・・・みたいに入力するとルートからすべて丸見えになってしまいます。ハッキングし放題・・・。

2B2B
質問者

お礼

ご回答ありがとうございます。 できないのは、正しいURLを取得することです。ディレクトリーとサブディレクトリーの表示するコードなんですが、インターネットで見つけて再利用してみましたが、正しいパス名を立てることができません。今のコードではパス名は(ドメイン名)/projects/website/projects/website/(ファイル名)になっています。 どこが行けないのかな? ちなみに$basedirは/projects/website/を格納する変数です。 このページは管理インターフェースからしかアクセスできないのでそういう脆弱性があっても大丈夫なんじゃないかな? HTTP_Downloadを閲覧いたしましたが、できないのは正しいURLを取得するのは、これを使っても問題にならないのじゃないでしょうか。 お手間をおかけしますが、またご回答をよろしくお願いいたします。

関連するQ&A