読者です 読者をやめる 読者になる 読者になる

画像リサイズディレクトリ "imgin" を作った

PHP

「アップロードした画像のリサイズ機能」というのはよくある機能です。

大規模なシステムであれば「画像プロキシサーバの構築」などもいいのですが、シンプルなシステムの場合は、そこまでしなくてもよかったりします。

リサイズ機能だけなら、「アップロード処理にフックして画像をリサイズする」のが常套手段ですが、今回は「簡単に設置できる」「CakePHPに依存しない」「リアルタイムリサイズな」「ガラケーでも見れる(同一ドメイン)」画像変換機構を作ってみました。

イデアベースですが、なかなか使いやすいのでは?と思っています。

k1LoW/imgin · GitHub

imgin

イメージとしては

「app/webroot/img/ 配下へのアクセス全てをmod_rewrite+imginの機構で制御して、リクエストURLから判断してリサイズ画像を生成する」

という感じです。

例えば、/img/ 以下がimginの制御下だった場合、オリジナル画像のURLが /img/foo/bar/large.jpg なら /img/100x120/foo/bar/large.jpg へのアクセスで、100px x 120px幅に収まるリサイズ画像が取得できます。

設置方法や使い方はREADME.mdを確認して見てください。

ルートのcomposer.jsonで管理がしにくいのですが、まあ、ちっちゃい機構なので、そのままコミットしちゃってください。

Filebinderとの連携例

fusic/filebinder · GitHub との連携をするとしたら以下のような感じでしょうか。

<?php
class Post extends AppModel
{
    public $actsAs = [
        'Filebinder.Bindable' => [
            'afterAttach' => 'clearImageCacheFile',
        ],
    ];

    public $bindFields = [
        [
            'field' => 'image',
            'tmpPath' => TMP,
            'filePath' => FILEBINDER_FILE_PATH,
        ],
    ];

    /**
     * clearImageCacheFile
     *
     */
    public function clearImageCacheFile($file)
    {
        exec('php '.FILEBINDER_FILE_PATH.'imgin.php clearcache '.$file, $output, $return);
        if ($return == 0) {
            return true;
        } else {
            return false;
        }
    }
}

更新画像ファイルアップロード時に、以前の画像キャッシュファイルを削除しなければならないのが玉にキズですね。

もっと

簡単に画像リサイズ機構が作れたらいいな。。。