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

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

PHPでディレクトリーとそのサブディレクトリー表示

PHPでディレクトリーとそのサブディレクトリーの中のファイルを表示して、ファイルであればダウンロード用のリンクを付け加えたいと思いますが、ここで嵌ってしまっています。 以下はソースコード(コメントアウトされている部分は試したコード、すべてだめだった) $dir = $_SERVER['DOCUMENT_ROOT'].'/projects/website/uploaded'.'/'.$_GET['user']; function getDirContents($dir) { global $basedir; $path=pathinfo($dir); $path1=$basedir.'/'.basename($dir); //echo $path1; //$path1=basename($dir); if (is_dir($dir)) { //$path1 .= basename($dir); //$path1 .='/'.basename($dir); $dirs = explode('/', $dir); $last_dir = $dirs[count($dirs) - 1]; echo '<strong>'.$last_dir.'</strong>'; if ($dh = opendir($dir)) { echo '<ul>'; while (($file = readdir($dh)) !== false) { if ($file == '.' || $file == '..' || substr($file,0,1)=='.') {} else { echo '<li>'; if (is_dir($dir.'/'.$file)) { $path1 .='/'.basename($file); getDirContents($dir.'/'.$file); } else { //echo $path1; $path2=pathinfo($path1); echo '<a href="'.$basedir.$path1.'/'.$file.'">'.$file.'</a>'; } echo '</li>'; } } echo '</ul>'; closedir($dh); } } return false; } getDirContents($dir); 因みにウェブサイトは、サーバーの/projects/website/にあります。表示したいフォルダはprojects/website/uploaded/にあります。そしてサブフォルだは/projects/website/uploaded/(ユーザ名)/(フォーム番号)/ わかる方がいらっしゃいましたら、ご回答を宜しくお願いいたします。

  • 2B2B
  • お礼率100% (60/60)
  • PHP
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • luka3
  • ベストアンサー率74% (290/390)
回答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

  • PHPでディレクトリのファイルをソート表示させる

    こちらのサイトを参考にして、PHPでディレクトリのファイルを表示させる プログラムを作りました。→ http://php.eweb-design.com/0206_di.php --------------------------------------------- <?php $rep = 1; // 最終更新日(表示=1 非表示=0) $sze = 1; // ファイルサイズ(表示=1 非表示=0) $lst = "./list"; // 表示するリストの名前(パス) $drc=dir($lst); print("<OL>"); while($fl=$drc->read()) { $lfl = $lst."/".$fl; $din = pathinfo($lfl); if(is_dir($lfl) && ($fl!=".." && $fl!=".")){ print("<LI>".$din["basename"]."<FONT size='-1'> (ディレクトリ)</FONT></LI>"); } else if($fl!=".." && $fl!=".") { print("<LI>"); print("<a href=".$lst."/".$fl.">".$fl."</a>"); // ファイル更新日 if($rep == 1 || $sze == 1) print("<FONT size='-1'> ("); if($rep == 1) echo date("m/d",filemtime($lfl)); if($rep == 1 && $sze == 1) print(", "); // ファイルサイズ if($sze == 1) echo round(filesize($lfl)/1024)."KB"; if($rep == 1 || $sze == 1) print(")</FONT> "); print("</LI>"); } } print("</OL>"); $drc->close(); ?> --------------------------------------------- しかし、ファイルがソートされていません。 どの様にしたらファイル名でソートして表示できるのでしょうか? 申し訳ありませんが、ご教示お願いします。

  • PHPのopendir関数って・・・。

    <?php $dir = "/etc/php5/"; // 既知のディレクトリをオープンし、その内容を読み込みます。 if (is_dir($dir)) { if ($dh = opendir($dir)) { while (($file = readdir($dh)) !== false) { echo "filename: $file : filetype: " . filetype($dir . $file) . "\n"; } closedir($dh); } } ?> 上の例の出力は、たとえば以下のようになります。 filename: . : filetype: dir filename: .. : filetype: dir filename: apache : filetype: dir filename: cgi : filetype: dir filename: cli : filetype: dir とありますが、 filename: . : filetype: dir filename: .. : filetype: dir は何もフォルダになくても出ますよね? これは何ですか??

    • ベストアンサー
    • PHP
  • ディレクトリ内一覧表示

    現在PHPにてディレクトリ内の中のディレクトリ一覧を作成しています。 わからないことがあり、ご投稿させていただきました。 imageフォルダの中に 20110101フォルダと20100101フォルダを作成しています。 imageフォルダ内のディレクトリを一覧表示させたいのですが、下記ソースですと、20110101しか表示されません。 おわかりの方がいらっしゃいましたらご教示お願いします。 $path = 'imageフォルダまでの絶対パス'; $dir = scandir($path, 1);//フォルダ内降順指定 if($dir != "." && $dir != "..") { $dirArray = array($dir); foreach($dirArray as $dir => $val) { for($i = 0; $i <= $dir; $i++) { $dirName = count($dirArray); echo $val[$dirName]; } } } closedir($dir); 宜しくお願いします。

    • ベストアンサー
    • PHP
  • PHPでディレクトリ名のみ表示する方法が知りたいです。以下のプログラム

    PHPでディレクトリ名のみ表示する方法が知りたいです。以下のプログラムで「test」というディレクトリ内のファイル一覧(ディレクトリ名とファイル名)を表示するようにしているのですが、この中からディレクトリ名のみ表示させたいのですがどのようにすればいいのでしょうか? よろしくお願いします。 <?php if ($dir = opendir("test/")) { while (($file = readdir($dir)) !== false) { if ($file != "." && $file != "..") { echo "$file<br>\n"; } } closedir($dir); } ?>

    • ベストアンサー
    • PHP
  • perl ディレクトリ ツリー表示

    下記ソースコードでカレントディレクトリのツリー表示ができますが、これを特定のディレクトリ内をツリー表示できるようにする方法がわかりません。 opendir関数の$dirの前にtestをつけましたが、うまく行きません。 特定のディレクトリは任意で変えることができることとします。 sub treelist_ { my ($dir, $lv) = @_; opendir my $dh, $dir; my @files = grep { $_ !~ /^\.\.?$/; } readdir $dh; closedir $dh; for my $file (@files) { print ">" x $lv, "$dir/$file\n"; treelist_("$dir/$file", $lv+1) if -d "$dir/$file"; } } sub tree { for my $dir (@_) { print "$dir\n"; treelist_($dir, 0); } } tree('.');

  • phpのディレクトリーorファイルのパーミッション

    お世話になります。 どうやってもうまくいかないので、質問させていただきます。 phpでログファイルを書き込むようにしたいのですが、 ファイルが作成されません。 根本的なところができていないのだと思いますが、教えてください。 やりたいことは、指定のパス(docomwnt_root配下の/logまたは include/log) にyyyymmdd.logで、テキストを書き込みたいのです。 いろいろ調べて、ディレクトリの場合は 0777、ファイルは0666にchmodすればよいとのことで 変更したのに、ファイルがないといわれてしまいます。 ソースコードは以下になります。 すみません、試行錯誤の名残とdebug行が入っています。 <?php //function logout($content){ $content="test"; error_log($content,0); //ログファイル設定 // $logpath = '/log'; // if( !is_dir($logpath) ){ // die("ディレクトリが存在しません -->". $logpath); // } //日時取得 $dateobj = new DateTime(); //アクセスタイム取得 $accessTime=$dateobj->format('Y-m-d H:i:s'); //書き込む内容 $log = $accessTime . " " . $content . "\n"; // ファイル名 $date = $dateobj->format('Ymd'); // $filename = realpath( $logpath ) . '/'.$date . '.log'; // $filename = dirname(__FILE__) . '/log/'. $date . '.log'; $filename = $date . '.log'; echo $filename; $directory_path = "./log"; if( mkdir( $directory_path, 0777) ){ echo "ok<br>"; chmod( $directory_path, 0777); } else{ echo "ng<ng>"; } if( !$fp = fopen($filename, 'ab') ){ echo "cannot open file($filename)<br>"; return -1; } if( !$fp = flock($fp, FILE_APPEND | LOCK_EX) ){ echo "cannot open file($filename)"; return -1; } if( fwrite($fp, $content) === FALSE){ echo "cannot write file($filename)<br>"; return -1; } if( !fclose($fp) ){ echo "cannot close file($filename)"; return -1; } // return 0; //} ?> この場合だと cannot open file になってしまいます。 windowsばかりやってきていたのでlinuxは、、、わかりません。 いろいろ、サンプルを試しているのですが、うまくいかなくて。。。 すみません、ご指導よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPのコード解析

    PHPで作られたサイトをカスタマイズしようとしているのですが、 なかなかうまくいかないので質問させていただきます。 以下のコードの意味をざっくりでいいので教えてほしいです。 ---------------- // Rename file... $file_name = drupal_substr(basename($file_path), 0, strrpos(basename($file_path), ".")); $file_name_ext = drupal_substr(basename($file_path), strrpos(basename($file_path), ".") + 1); $new_name_hook = module_invoke_all('mp_file_name', $dir, $file_name, $file_name_ext, $node->nid, $title); $new_name = $new_name_hook[count($new_name_hook)-1]; ---------------- ファイルをアップロードした際の動作について記述されていると思っているのですが、 PHP初心者のため理解できませんでした。 どうかお助けください。 可能であればファイルをアップロードした際にファイル名が同じ名前だった場合、 上書きせずに既存のファイルをリネームして残してくれるようなコードへの変更も 教えていただけると本当に助かります!! よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • フォルダ内のファイル名を取得して配列にぶち込みたいです

    こんにちは。 フォルダ内ファイル名を一覧にして表示させることまでは出来ますが、 この一覧表示されたファイル名を配列に入れるにはどうしたらよいでしょうか。 <?php $dir = "sample/"; // ディレクトリの内容を読み込みます。 if ($dh = opendir($dir)) { while (($file = readdir($dh)) !== false) { echo "filename: " . $file . "<br />\n"; } closedir($dh); } ?> ご教示宜しくお願い致します。

    • ベストアンサー
    • PHP
  • ディレクトリ内の最新の画像のみ表示したい。

    ディレクトリファイルから画像ファイルの更新日時を取得して、 拡張子を問わず、最新の画像のみ表示させたいのですが、 うまく出来ません。ご教授お願いします。 ~・~・~・~・~・~・~ <?php $dir = @opendir("****"); while($file = readdir($dir)) { $kaku = substr($file, -3, 3); if($kaku=="jpg" || $kaku=="gif" || $kaku=="png"){ $cnt++; $last = date("ymdHis", filemtime($file)); $img="$last$file"; $filename[$cnt]=$file; } } closedir($dir); } arsort($img); $img_file= substr($img, 12); $cnt=0; foreach($img_file as $value){ $cnt++; if ($cnt<=1){ echo "<img src=\"$value\">"; } } ?>

    • ベストアンサー
    • PHP
  • PHPファイル・アップロードに関する質問

    あるPHP技術書籍で掲載のPHPファイル・アップロードの例を試したところ、アップロードするファイル・サイズは、小さいな(数KB)場合が成功、より大きな場合(例えば40KB~)が失敗!何故失敗なのかよく分かりません。ファイル種類には関係なさそうです。 詳しい方に教えて頂ければ助かります。 ※ ご参考 - 1. 具体的なHTML&PHPコードは、次の通りです。 2. 利用環境: 最新版XAMPP、Windows 7、XAMPPデフォルト・ルートをD:のある フォルダーに変更。D:に十分空き領域があると確認済み(数十GB)。 =====HTML===================== <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title>fupload</title> </head> <body> <h3>ファイルアップロード</h3> <form method="POST" action="fupload.php" enctype="multipart/form-data"> <!-- MAX_FILE_SIZE は、必ず "file" input フィールドより前になければなりません --> <input type="hidden" name="MAX_FILE_SIZE" value="100000" /> <!-- input 要素の名前が $_FILES 配列での名前となります --> <input name="userfile" type="file" size="70"/> <input type="submit" value="アップロード" /> </form> </body> </html> =====PHP--===================== <?php $uploaddir = './up/file/'; $uploadfile = basename($_FILES['userfile']['name']); echo '<pre>'; //if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploaddir.$uploadfile)) { echo "ファイルアップロードに成功しました。\n"; } else { echo "ファイルアップロードは不成功です。\n"; } echo '<pre>'; ?> =====PHP関連設定(php.ini)========-== ;;;;;;;;;;;;;;;; ; File Uploads ; ;;;;;;;;;;;;;;;; ; Whether to allow HTTP file uploads. ; http://php.net/file-uploads file_uploads=On ; Temporary directory for HTTP uploaded files (will use system default if not ; specified). ; http://php.net/upload-tmp-dir upload_tmp_dir="C:\xampp\tmp" ; Maximum allowed size for uploaded files. ; http://php.net/upload-max-filesize upload_max_filesize=2M ; Maximum number of files that can be uploaded via a single request max_file_uploads=20

    • ベストアンサー
    • PHP