CodeIgniter 3 ファイルアップロードクラス(Library Reference - File Uploading Class)
CodeIgniter User GuideLibrary ReferenceのFile Uploading Classについて調べてみます。
File Uploading Class
File Uploading Class
ファイルアップロード処理を簡易にすることに加え、
・ファイル拡張子
・画像サイズ
・画像の大きさ
等の制限をかけることができるようです。
Creating the Upload Form
プログラムを見ながらのほうが理解が速いので、サンプルから。
まず、アップロード用のフォームを作成します。
「application/views/」に「upload_form.php」というファイルを作成。
以下の内容を記載します。
- <html>
- <head>
- <title>Upload Form</title>
- </head>
- <body>
- <?php echo $error;?>
- <?php echo form_open_multipart('upload/do_upload');?>
- <input type="file" name="userfile" size="20" />
- <br /><br />
- <input type="submit" value="upload" />
- </form>
- </body>
- </html>
The Success Page
続いて、アップロード成功画面です。
「application/views/」に「upload_success.php」というファイルを作成。
以下の内容を記載します。
- <html>
- <head>
- <title>Upload Form</title>
- </head>
- <body>
- <h3>Your file was successfully uploaded!</h3>
- <ul>
- <?php foreach ($upload_data as $item => $value):?>
- <li><?php echo $item;?>: <?php echo $value;?></li>
- <?php endforeach; ?>
- </ul>
- <p><?php echo anchor('upload', 'Upload Another File!'); ?></p>
- </body>
- </html>
The Controller
最後にコントローラーです。
「application/controllers/」に「Upload.php」というファイルを作成。
以下の内容を記載します。
- <?php
- class Upload extends CI_Controller {
- public function __construct() {
- parent::__construct();
- $this->load->helper(array('form', 'url'));
- }
- public function index() {
- $this->load->view('upload_form', array('error' => ' ' ));
- }
- public function do_upload() {
- $config['upload_path'] = './uploads/';
- $config['allowed_types'] = 'gif|jpg|png';
- $config['max_size'] = 100;
- $config['max_width'] = 1024;
- $config['max_height'] = 768;
- $this->load->library('upload', $config);
- if ( ! $this->upload->do_upload()) {
- $error = array('error' => $this->upload->display_errors());
- $this->load->view('upload_form', $error);
- } else {
- $data = array('upload_data' => $this->upload->data());
- $this->load->view('upload_success', $data);
- }
- }
- }
The Upload Directory
最後に、ファイルをアップロードするためのディレクトリを作成します。
CodeIgniterをインストールしたディレクトリに、「uploads」というフォルダを作成。
書き込み権限(777)を付与します。
# cd /path/to/codeigniter3
# mkdir uploads
# chmod 777 uploads
Try it!
これで準備完了です。
ブラウザで、http://[サーバーIP]/uploadにアクセスします。

適当にファイルを選んでアップロード実行。
アップロードしたファイルの詳細が表示されました。
もちろん、上記で作成したuploadsフォルダに画像が配置されています。

許可していない拡張子のファイルをアップロードしようとすると
エラーが表示されました。

複数ファイルのアップロード
マニュアルを読んでいて気になったのは、
http://php.net/manual/ja/features.file-upload.multiple.php
こういった感じで、複数ファイルのアップロードはできるんだろうか?
upload_form.phpを編集します。
- <html>
- <head>
- <title>Upload Form</title>
- </head>
- <body>
- <?php echo $error;?>
- <?php echo form_open_multipart('upload/do_upload');?>
- <input type="file" name="userfile[]" size="20" />
- <input type="file" name="userfile[]" size="20" />
- <input type="file" name="userfile[]" size="20" />
- <br /><br />
- <input type="submit" value="upload" />
- </form>
- </body>
- </html>
適当にファイルを選択してアップロード実行。

エラーになりました。
Message: is_uploaded_file() expects parameter 1 to be string, array given

ライブラリのソースを追ってみましたが、どうも複数ファイルのアップロードは
対応していない模様。
こちらで解決策を見つけました。
Multiple files upload (Array) with CodeIgniter 2.0
$_FILESを書き換え。
initializeを繰り返してdo_upload()を実行しろとのこと。
いっそ、MY_Uploadを作ったほうが速い気もしますが、試してみます。
このコードでうまくアップロード出来ました。
- <?php
- class Upload extends CI_Controller {
- public function __construct() {
- parent::__construct();
- $this->load->helper(array('form', 'url'));
- }
- public function index() {
- $this->load->view('upload_form', array('error' => ' ' ));
- }
- public function do_upload() {
- // 設定
- $config['upload_path'] = './uploads/';
- $config['allowed_types'] = 'gif|jpg|png';
- $config['max_size'] = 10000;
- $config['max_width'] = 1024;
- $config['max_height'] = 768;
- $this->load->library('upload', $config);
- // 一旦、$_FILESを退避
- $files = $_FILES;
- // アップロードされた件数を確認
- $cpt = count($_FILES['userfile']['name']);
- // ループしながら$_FILESを上書き
- for ($i = 0; $i < $cpt; $i++) {
- $_FILES['userfile']['name']= $files['userfile']['name'][$i];
- $_FILES['userfile']['type']= $files['userfile']['type'][$i];
- $_FILES['userfile']['tmp_name']= $files['userfile']['tmp_name'][$i];
- $_FILES['userfile']['error']= $files['userfile']['error'][$i];
- $_FILES['userfile']['size']= $files['userfile']['size'][$i];
- if ( ! $this->upload->do_upload()) {
- $error = array('error' => $this->upload->display_errors());
- $this->load->view('upload_form', $error);
- return;
- }
- }
- // お試しなので、最後のファイル上だけ表示
- $data = array('upload_data' => $this->upload->data());
- $this->load->view('upload_success', $data);
- }
- }
html5のmultiple属性
multiple属性を追加して、動作を確認してみます。
upload_form.phpをこんな感じに修正しました。
- <html>
- <head>
- <title>Upload Form</title>
- </head>
- <body>
- <?php echo $error;?>
- <?php echo form_open_multipart('upload/do_upload');?>
- <input type="file" name="userfile[]" size="20" multiple />
- <br /><br />
- <input type="submit" value="upload" />
- </form>
- </body>
- </html>

コントローラーのコードは修正していません。
これでも複数ファイルのアップロードが行えました。
CodeIgniter 3のユーザーガイド(User Guide)まとめ
- 関連記事
-
- Ubuntu 14.04にGoogle App Engine(GAE) + PHPの開発環境を構築する
- EC2 + PHPで構築したサイトにアップロードしたファイルをAmazonS3に保存する
- CodeIgniter 3 ファイルアップロードクラス(Library Reference - File Uploading Class)
- RDS + PostgreSQL 9.3にEC2からプライベートIPで接続
- CodeIgniter3でPostgreSQLを使用する
コメント