2012年10月10日水曜日

FuelPHPで、ファイルのアップロード&サムネイル画像

FuelPHP(1.3)で、ファイルのアップロード機能を追加してみました。今回は、画像をアップロードする機能を追加してみたわけですが、ファイルのチェックが簡単に行えるので、非常に楽。アップロード後は、Imageクラスを利用すると、サムネイル画像など簡単に準備することができました。

さて、サムネイル画像を生成するエレガントなソースを見つけたので、メモ。元ネタはこちら何が素晴らしいって、画像のアップロードの際、一緒にサムネイル画像を生成しておく必要がありません。サムネイルのサイズ指定は、URLの$width, $height部分の指定を変更してもらうことで、デザイナーさんに丸投げ出来ます。世の中、賢い人がいるものです。心から感謝。

public function action_thumbnail($width, $height, $filename) {
    $width  = (int) $width;
    $height = (int) $height;
    $basepath = DOCROOT.'files/';
    $orig_filename = $basepath.$filename;
    $thumbpath = 'images/'.$width.'/'.$height.'/';
    
    if (file_exists($basepath.$thumbpath.$filename))
    {
        header('Content-Type: image/jpeg');
        echo File::read($basepath.$thumbpath.$filename);
    }
    else if(file_exists($orig_filename) && strpos(realpath(dirname($orig_filename)), realpath($basepath)) !== false && $width > 0 && $height > 0)
    {
        if (!file_exists($basepath.$thumbpath))
            File::create_dir($basepath, $thumbpath);

        \Image::config(array(
            'persistence' => true,
        ))->load($orig_filename)
            ->resize($width,$height)
            ->save($basepath.$thumbpath.$filename)
            ->output();
    }
    else
    {
        throw new HttpNotFoundException;
    }
}
Viewは、こんな感じ。
<?php echo Html::img('post/thumbnail/200/100/'.$post->pic); ?>
<?php echo Html::img('post/thumbnail/300/200/'.$post->pic); ?>
<?php echo Html::img('post/thumbnail/400/300/'.$post->pic); ?>


参考サイト
fuelphpでファイルのアップロード(実践編その8)(WinRoad徒然草さん)
FuelPHPのImageクラス(WinRoad徒然草さん)

2 件のコメント:

  1. 参考にさせていただきました!
    1つハマッてしまったのでコメントさせて頂きます。
    $filenameにて、拡張子が取得できませんでした。
    そのため、呼び出し元からの指定を『width/height/画像名/拡張子』の形式で行い、それに合わせて改良して使用しました。

    そして、1つ気になるところが、
    初めてリサイズするときに画像が表示されません。
    画像作成自体はできているので2回目以降は表示されるのですが、なんとか治したいと思い対応中です。

    返信削除
    返信
    1. コメントありがとうございます。

      サンプルソースは、どれも参考用で、いい加減なものですので、適当にご自分の環境に合わせてご利用下さい。

      初回の表示は、画像の生成が間に合わないと、表示されないことがあると思います。
      サムネイルが出来上がったのを確認してから表示するような仕組みにしていただければ、問題ないかと思います。

      削除