ディレクトリ内のファイルを読み込んで画像を出力
ファイル構成は以下 display_images
imageは画像を格納するためのフォルダ
index.phpに画像を一覧として表示させるための処理を記述していく
scandir関数を使って画像を表示させる
index.php
function h($var){
if(is_array($var)){
return array_map('h',$var);
} else {
return htmlspecialchars($var , ENT_QUOTES, 'UTF-8');
}
}
//画像を一覧表示するディレクトリ
$dirName='image';
if(!is_dir($dirName)){
die('ディレクトリが存在しません');
}
echo "<p>ディレクトリ名(相対パス):$dirName<br />";
echo '絶対パス:'.realpath($dirName).'</p>';
echo '<p>ディレクトリ内の画像一覧</p>';
//ディレクトリを調べる
$dir = scandir($dirName);
//ディレクトリ内の画像を一覧表示
foreach($dir as $d){
$path = $dirName . '/'.$d;
//「.」から始まる要素とディレクトリを除外
if(strpos($d,'.') === 0 || is_dir($path)){
continue;
}
//getimagesize関数で画像ファイルかどうかを確認
if(@getimagesize($path) !== false){
//拡張子がGIF PNG JPGの画像を表示
$extension = pathinfo($path,PATHINFO_EXTENSION);
$extension_array = array('gif','png','jpg','jpeg');
if(!in_array($extension, $extension_array)){
continue;
}
$imageFile = 'display.php?file='.rawurlencode($d);
echo '<a href="'.h($imageFile).'" target="_blank">';
echo '<img src="'.h($imageFile).'" alt="写真" width="100" />';
echo '</a>';
}
}
##ポイント
scandir()関数を使うとドットから始まる不要なファイルも含まれる
Macを使用していれば.DS_Storeも含まれるので一度これらを削除していきたい。
strposを使用してディレクトリと要素をコンティニューしてスキップする
次にgetimagesize関数で画像ファイルかどうかを確認
OKであれば特定の拡張子のみの画像を表示させるように指定する
pathinfo関数で拡張子を取得する
次に自分が指定したい拡張子のものを$extension_arrayに入れる
もし、これで$extension_arrayに含まれない拡張子であれば同様にスキップして除外する
画像のURLを知られないためにもdisplay.php?file=にする
$dに入っている画像の名前をrawurlencode関数で一度エンコードする
この時点では画像は表示されない
画像を表示するためにもdisplay.phpのコーディングを進めていく
display.php
if(!isset($_GET['file'])){
die('表示するファイルが指定されていません。');
}
$fileName = basename($_GET['file']);
$dirName = 'image';
$subDirList = array('output' => 1);//表示を許可するディレクトリのリスト
if(isset($_GET['dir'])){
if(!isset($subDirList[$_GET['dir']])){
die('不正な指定がありました');
}
$path = $dirName . '/' . $_GET['dir'] . '/' . $fileName;
} else {
$path = $dirName . '/' . $fileName;
}
//画像を出力する
if(file_exists($path) && ($imageSize = getimagesize($path)) !== false ){
//HTTPヘッダーが送信されていなければ画像単独表示と判定してHTTPヘッダーを送信
if(! headers_sent()){
header('Content-Type:' . $imageSize['mime']);
//Internet ExploerがContent-Typeヘッダーを無視しないようにします
header('X-Content-Type:nosniff');
}
readfile($path);
} else {
echo "画像の出力ができません";
}
$_GETでファイル名を渡す
画像だけを単独表示させる場合HTTPヘッダーを送信しておく必要があるので、headers_sent関数を使ってすでにHTTPヘッダーが送信されているかどうかを確認する
getimagesize関数で取得したMIMEタイプをheader関数で送信。
最後にreadfile関数を使って画像を出力する
basename関数はロケールに依存するので日本語ファイルパスを処理するときはロケールを正しく設定する必要がある ロケールの設定
setlocale(LC_ALL,'ja_JP.UTF-8');// UNIX系OS
setlocale(LC_ALL,'japanese');// Windows
##参考リンク