例えば、FLASHが外部画像を読み込む場合、FLASHはディレクトリにどんなファイルがあるのか分からないので、ファイルのリストをXMLなどに持つことになるが、更新の際に画像ファイルのアップとXMLの更新が必要でめんどくさいし、ミスも起こりやすい。
なので自動的にXMLを吐き出してくれるPHPを作った。
ソース
<?php
//GETで受け取ったフォルダ名を適応
if($_GET["dir"]){
//上位階層へのパスであればエラーにする
if (ereg("../", $_GET["dir"])){
$erorr="セキュリティ上、上位階層は表示できません";
}
//ルートパスであればエラーにする
if($_GET["dir"][0] == "/"){
$erorr="セキュリティ上、ルートパスは使えません";
}
//末尾に"/"がついていなければつける
if(substr($_GET["dir"], -1, 1) != "/"){
$_GET["dir"] = $_GET["dir"] . "/";
}
$path = $_GET["dir"];
}else{
$path = "./";
}
//フォルダを開く
if ($dir = @opendir($path) ) {
//繰り返しディレクトリ内のファイルを読む
while(false !== ($file = readdir($dir))) {
//is_dirは参照が狂うので、パスで指定
$filePath = $path . $file;
if (is_dir($filePath)){
if($file != "." && $file != ".."){
$dirs[] = $file;
}
}else{
$files[] = $file;
}
}
}else if($erorr == false){
$erorr="ディレクトリを開けませんでした";
}
//以下出力部分
print "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n";
?>
<info>
<?php
if($erorr){
print "\t<erorr message=\"" . $erorr . "\" />\n";
}else{
?>
<dirs>
<?php
if($dirs){
foreach($dirs as $value){
print "\t\t<dir name=\"" . $value . "\" />\n";
}
}
?>
</dirs>
<files>
<?php
if($files){
foreach($files as $value){
print "\t\t<file name=\"" . $value . "\" />\n";
}
}
?>
</files>
<?php
}
?>
</info>
出力例
<?xml version="1.0" encoding="UTF-8" ?> <info> <dirs> <dir name="css" /> <dir name="js" /> </dirs> <files> <file name="index.html" /> <file name="top.html" /> </files> </info>
PHPのファイル名をdirInfo.phpとしたとする
dirInfo.phpにアクセスすると、カレントディレクトリの内容のXMLが吐き出される。
また、dirInfo.php?dir=hogehogeとdirパラメータを渡すことで、hogehogeディレクトリの内容のXMLが吐き出すことができる。
※悪用されると、このPHPを設置したディレクトリ以下で表示権限を持っているファイルは、すべて見られる可能性があるので注意すること。
