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

更新日: 2016年2月25日

実行時間: 0.0298

CI_Upload

 「CI_Upload」ライブラリクラスは、クライアントからアップロードされるファイルを受け取り、
ファイルシステムに保存する機能を提供します。

 PHPにはスーパーグローバル変数「$_FILES」がありますが、CodeIgniterでWebアプリケーションを
開発する際は、「$_FILES」変数は使わず、「CI_Upload」ライブラリクラスを使います。

CI_Uploadの設定

 「CI_Upload」クラスには以下の設定項目があります。
 「CI_Upload」をロードする際に指定するか、「application/config/upload.php」設定ファイルで設定します。

項目 デフォルト 説明
max_size 0 許容する最大ファイルサイズをKB単位で設定します。
php.iniの「upload_max_filesize」より大きな値を設定した場合、 最大値は「upload_max_filesize」のサイズになります。
また、0 を指定しても最大値は「upload_max_filesize」のサイズが適用されます。
max_width 0 アップロードされるファイルが画像の場合の許容する最大幅
(ピクセル)を設定します。0 を設定すると制限は無くなります。
max_height 0 アップロードされるファイルが画像の場合の許容する最大高さ
(ピクセル)を設定します。 0 を設定すると制限は無くなります。
max_filename 0 アップロードされるファイルの許容するファイル名の長さを設定します。
ファイル名にマルチバイト文字列が含まれる場合は、php.iniの「mbstring.func_overload」 の設定により、取得される文字数が変わってくるため注意が必要です。 0 を設定すると制限は無くなります。
allowed_types 許容するファイルのMIMEタイプを設定します。デフォルトでは全て拒否するため、 必ず指定する必要があります。設定方法はファイルの拡張子を指定します。「|」区切りで複数設定できます。 全てを許可する場合は「*」を設定します。
「application/config/mimes.php」ファイルが参考になります。
file_name アップロードされるファイルのファイル名を設定したファイル名に強制的に書き換えます。 デフォルトは書き換えません。
upload_path アップロードされたファイルを保存するディレクトリパスを設定します。 相対パスで記述する場合はドキュメントルートからの相対パスとなります。
デフォルトではドキュメントルートに保存されてしまうため、必ず設定することをお勧めします。
設定したディレクトリパスには書き込み権限が必要です。
overwrite FALSE TRUEに設定すると、同名のファイルがアップロードされた場合、ファイルは上書きされます。
FALSEを設定するとファイル名に番号が振られ新たに保存されます。 番号は1から99まで割り振られ、それ以上はエラーとなります。
encrypt_name FALSE TRUEに設定するとランダムな32文字のファイル名で、アップロードされたファイルを保存します。
remove_spaces TRUE TRUEに設定すると、ファイル名にスペースが含まれている場合、スペースを「_」アンダースコアに変換します。
xss_clean FALSE TRUEに設定するとアップロードされた画像ファイルからXSSの可能性があるデータを取り除きます。

CI_Uploadのロード

 「CI_Loader」クラスの「library()」メソッドで「CI_Upload」クラスをロードします。
「application/config/upload.php」の設定を利用せず、第二引数に設定連想配列を指定することもできます。

    $this->load->library('upload');
    $config = array(
        'upload_path' => '../tmp',
        'overwrite' => TRUE,
        'allowd_types' => '*',
    );
    $this->load->library('upload', $config);

CI_Uploadの機能

 「CI_Upload」ライブラリクラスは、以下のようなHTMLの「FORM」から送信されたファイルを処理します。

    <form action="/file/upload/" method="post" accept-charset="utf-8" enctype="multipart/form-data">
      <input type="file" name="userfile" />
      <input type="submit" value="送信" />
    </form>

do_upload($field = 'userfile')

 HTMLの「FORM」から送信されたファイルをファイルシステムに保存します。
 引数にはFORMの「<input type="file" name="userfile">」タグで指定した「name=」属性の値(文字列)を指定します。  デフォルトは「userfile」となっているため、「name=」属性を「userfile」とした場合は引数は不要です。

    $this->load->library('upload');
    if ($this->upload->do_upload('my_file_name')) {
        $this->load->view('upload_success');
    }
    else {
        $this->load->view('upload_form');
    }

data()

 アップロードされたファイルのファイル情報を連想配列で返します。

    $config = array(
        'file_name' => 'sample.jpg';
        'upload_path' => '/tmp';
        'allowed_types' => '*';
    );
    $this->load->library('upload', $config);
    if ($this->upload->do_upload()) {
        $file_info = $this->upload->data();
        print_r($file_info);
    }
    /*
    Array
    (
        [file_name] => sample.jpg
        [file_type] => image/jpeg
        [file_path] => /tmp/
        [full_path] => /tmp/sample.jpg
        [raw_name] => sample
        [orig_name] => sample.jpg
        [client_naem] => UserSent.jpg
        [file_ext] => .jpg
        [file_size] => 548.12
        [is_image] => 1
        [image_width] => 1024
        [image_height] => 768
        [image_type] => jpeg
        [image_size_str] => width="1024" height="768"
    )
    */

 参照できるファイル情報には以下のものがあります。

項目 説明
file_name ファイルシステムに保存したファイル名
設定項目「encrypt_name」がTRUEの場合はランダム文字列で生成されたファイル名
設定項目「overwrite」がFALSEの場合はファイル番号が付加されたファイル名
file_type ファイルのMIMEタイプ
file_path ファイルを保存したディレクトリパス
full_path 保存したファイル名を含めたディレクトリパス
raw_name 拡張子を除く保存したファイル名
orig_name 設定項目「file_name」で指定したファイル名
client_name クライアントが送信した元のファイル名
file_ext ファイル拡張子
file_size ファイルサイズ (KB)
is_image アップロードされたファイルが画像の場合は「1」、画像以外の場合は「0」
image_width アップロードされたファイルが画像の場合の画像の横幅 (ピクセル)
image_height アップロードされたファイルが画像の場合の画像の高さ (ピクセル)
image_type アップロードされたファイルが画像の場合の画像の画像フォーマットタイプ
image_size_str HTMLタグで利用を想定した画像のサイズを表わす文字列
width="1024" height="768"

display_errors($open = '<p>', $close = '</p>')

 「do_upload()」メソッドは、エラーが発生するとエラー情報をインスタンス変数に保持します。
 そのエラーメッセージを「display_errors()」メソッドで取得できます。

 第一引数にエラーメッセージの先頭に付加する文字列を、第二引数にエラーメッセージの末尾に付加する文字列を指定します。
 デフォルトは、「<p>」と「</p>」です。

    $this->load->library('upload');
    if ($this->upload->do_upload()) {
        $this->load->view('upload_success');
    }
    else {
        $msg = $this->upload->display_errors(' <p style="color:red;">', '</p>');
        $data['error_msg'] = $msg
        $this->load->view('upload_form', $data);
    }

  • upload_form.php
  • <?php echo $error_msg; ?>
    <form action="/file/upload/" method="post" accept-charset="utf-8" enctype="multipart/form-data">
      <input type="file" name="userfile" /><br>
      <input type="submit" value="送信" />
    </form>

  • ブラウザ上の描画
  • The filetype you are attempting to upload is not allowed.





エラーメッセージの日本語化

 「CI_Upload」で利用されるエラーメッセージはデフォルトでは
「system/language/english/upload_lang.php」に英語で定義されています。
 日本語など多言語化対応するには「system/language/english/upload_lang.php」を 「application/language/言語サブディレクトリ/」にコピーして編集します。

    $ cp system/language/english/upload_lang.php application/language/japanese/