- ベストアンサー
PHPでディレクトリとサブディレクトリの表示方法
- PHPを使用してディレクトリとそのサブディレクトリの中のファイルを表示する方法について教えてください。
- 表示したファイルにはダウンロード用のリンクも付け加えたいです。
- ウェブサイトのフォルダ構造には/projects/website/uploaded/があり、サブフォルダは/projects/website/uploaded/(ユーザ名)/(フォーム番号)/です。
- みんなの回答 (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で解決しようとするのでよけい混乱する、と。
その他の回答 (2)
- Dags
- ベストアンサー率78% (11/14)
$dirがフルパス情報持ってるので、無駄な情報を削除すれば動作しますよ。 動作確認しました。
お礼
ご回答ありがとうございます。ディレクトリーの表示は既に動作していたが、URLが正しくありませんでした。
- kosukejlampnet
- ベストアンサー率44% (126/282)
何がどうできないのかが、ちょっと不明ですが、 > ファイルであればダウンロード用のリンクを付け加えたいと思いますが、ここで嵌ってしまっています。 ここの部分については、 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=../../../・・・みたいに入力するとルートからすべて丸見えになってしまいます。ハッキングし放題・・・。
お礼
ご回答ありがとうございます。 できないのは、正しいURLを取得することです。ディレクトリーとサブディレクトリーの表示するコードなんですが、インターネットで見つけて再利用してみましたが、正しいパス名を立てることができません。今のコードではパス名は(ドメイン名)/projects/website/projects/website/(ファイル名)になっています。 どこが行けないのかな? ちなみに$basedirは/projects/website/を格納する変数です。 このページは管理インターフェースからしかアクセスできないのでそういう脆弱性があっても大丈夫なんじゃないかな? HTTP_Downloadを閲覧いたしましたが、できないのは正しいURLを取得するのは、これを使っても問題にならないのじゃないでしょうか。 お手間をおかけしますが、またご回答をよろしくお願いいたします。
お礼
ありがとうございます。たいへん助かりました。