人生の恥は書き捨て

プログラムとかいろいろ

fuelPHPで同じ名前のファイルアップロードができない件

はじめに

fuelPHPで同じ名前のファイルがアップロードできないという事がありました。
応急処置的な対処をしたので、方法を書いておきます。

auto_rename

fuelのuploadでは同じ名前のファイルをアップロードする場合、
3つの方法が選べます。

auto_rename = true

として同じ名前のファイルがアップされたら元ファイル名_(数字).extensionとする。

auto_rename = false

として同じ名前のファイルがあったら書き込みをしない。

auto_rename = false
overwrite =true

として同じ名前のファイルが来たら上書きする。
この3つです。

…ですが、auto_renameは正しく動いていないようです。
ここにauto_rename動いてねーよ!っていうプルリクが投げられた痕跡もあるようですが、
現状直ってない。
Fix auto_rename file checking logic by kenjis · Pull Request #1152 · fuel/core · GitHub

そもそもアップロードされた画像をそのままの名前で保存するのってどうなの?ってのもあるので、
今回は自分でrenameして保存することにします。

Uploadクラスのregistarメソッドでcallback関数を呼ぶ

詳しくはUpload 使い方 - クラス - FuelPHP ドキュメントに書いてあるのですが、
Uploadクラスのregistarメソッドでupload前の処理やあとの処理を設定できるようです。
registarの第1引数にvalidateを指定するとファイル保存前に処理を挟む事ができます。

これを使って、自分でファイル名を設定します。

Upload::register('validate',function(&$file){
            $uid = uniqid("image_");
            $file['basename'] = $uid;
            $file['name'] = $uid;
            $file['name'] .= ".".$file['extension'];
        });
        Upload::process();
        if (Upload::is_valid())
        {
            Upload::save();
        }

これでファイル名を指定してファイル保存ができます。