Restoration
1/30/2017 - 11:37 AM

ディレクトリ内のファイルを読み込んで画像を出力

ディレクトリ内のファイルを読み込んで画像を出力

ファイル構成は以下 display_images

  • index.php
  • display.php
  • image

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

##参考リンク