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」の設定を利用せず、第二引数に設定連想配列を指定することもできます。
'upload_path' => '../tmp',
'overwrite' => TRUE,
'allowd_types' => '*',
);
$this->load->library('upload', $config);
CI_Uploadの機能
「CI_Upload」ライブラリクラスは、以下のようなHTMLの「FORM」から送信されたファイルを処理します。
<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」とした場合は引数は不要です。
if ($this->upload->do_upload('my_file_name')) {
$this->load->view('upload_success');
}
else {
$this->load->view('upload_form');
}
data()
アップロードされたファイルのファイル情報を連想配列で返します。
'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>」です。
- upload_form.php
- ブラウザ上の描画
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);
}
<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/言語サブディレクトリ/」にコピーして編集します。