2015年10月25日日曜日

fuelphpのImageクラスでThe library does not support this filetype for /tmp/*って出てしまう問題を解決する的なお話

  • このエントリーをはてなブックマークに追加

ファイルをアップロードして、そこからcropするなりresizeするなりしておきたい場合がある。
fuelphpにはUploadクラスやImageクラスで簡単にそこら辺が使えて便利だったりはするけど、
なんかいちいちアップロードして一時的なフォルダにおいて、
そのファイルをごにょごにょして格納したいフォルダにおいて、
一時的なフォルダに逃がしておいたファイルを消すという作業は面倒なわけで。

ってことで今回はその面倒な過程を省略するんだけど、
その途中でエラーが出てしまう問題を解決する的なお話をば。

公式ドキュメントではこんな感じ。

で、これを正直に使ってしまうとなぜかこんなエラーが出てしまう。
RuntimeException [ Error ]:The library does not support this filetype for /tmp/phpcudWEa.

で色々と探ってみたところ言及しているツイートがあって、原因としてはこのImageクラスにあるらしい。

ちなみにドライバがGDなのが悪いかと思って他のを使ってみたけど同様のエラーが出てしまう。
ということから察すると/tmp/****のような一時的な拡張子無しファイルはImageクラスでは通常読み込めないという感じじゃないんかと。
ってことでツイートに書かれているようにとあるconfigを記載してあげるとうまくいく。
ただしpersistece=>trueとなってるが正しくはpersistence=>trueであるけど。

ってことで正しい書き方はこんな感じになる。
// 画像を読み込む
Image::load('filename.gif');

// 画像をアップロードし、Image::load メソッドへ直接渡す
Upload::process(array(
    'path' => DOCROOT.DS.'files'
));

if (Upload::is_valid())
{
    $data = Upload::get_files(0);

    // アップロードデータのファイルを使い、
    // $force_extension として画像の拡張子を強制することができる。
    Image::forge(array("persistence" => true))->load($data['file'], false, $data['extension'])
        ->crop_resize(200, 200)
        ->save('image');    
} 
ってことでこんな感じでやってあげれば無事に解決出来るという。
公式ドキュメントに書かれている内容通りにやってNGってなるのが地味にきついなぁという感じではあった的な。

Adsense