CodeIgniter 3 ファイルアップロードクラス(Library Reference - File Uploading Class)

CodeIgniter User Guide

Library ReferenceのFile Uploading Classについて調べてみます。
File Uploading Class



File Uploading Class



ファイルアップロード処理を簡易にすることに加え、

・ファイル拡張子
・画像サイズ
・画像の大きさ

等の制限をかけることができるようです。




Creating the Upload Form



プログラムを見ながらのほうが理解が速いので、サンプルから。
まず、アップロード用のフォームを作成します。

「application/views/」に「upload_form.php」というファイルを作成。
以下の内容を記載します。


  1. <html>
  2. <head>
  3. <title>Upload Form</title>
  4. </head>
  5. <body>
  6. <?php echo $error;?>
  7. <?php echo form_open_multipart('upload/do_upload');?>
  8. <input type="file" name="userfile" size="20" />
  9. <br /><br />
  10. <input type="submit" value="upload" />
  11. </form>
  12. </body>
  13. </html>







The Success Page



続いて、アップロード成功画面です。
「application/views/」に「upload_success.php」というファイルを作成。
以下の内容を記載します。


  1. <html>
  2. <head>
  3. <title>Upload Form</title>
  4. </head>
  5. <body>
  6. <h3>Your file was successfully uploaded!</h3>
  7. <ul>
  8. <?php foreach ($upload_data as $item => $value):?>
  9. <li><?php echo $item;?>: <?php echo $value;?></li>
  10. <?php endforeach; ?>
  11. </ul>
  12. <p><?php echo anchor('upload', 'Upload Another File!'); ?></p>
  13. </body>
  14. </html>






The Controller



最後にコントローラーです。
「application/controllers/」に「Upload.php」というファイルを作成。
以下の内容を記載します。


  1. <?php
  2. class Upload extends CI_Controller {
  3.     public function __construct() {
  4.         parent::__construct();
  5.         $this->load->helper(array('form', 'url'));
  6.     }
  7.     public function index() {
  8.         $this->load->view('upload_form', array('error' => ' ' ));
  9.     }
  10.     public function do_upload() {
  11.         $config['upload_path']         = './uploads/';
  12.         $config['allowed_types']        = 'gif|jpg|png';
  13.         $config['max_size']             = 100;
  14.         $config['max_width']            = 1024;
  15.         $config['max_height']         = 768;
  16.         $this->load->library('upload', $config);
  17.         if ( ! $this->upload->do_upload()) {
  18.             $error = array('error' => $this->upload->display_errors());
  19.             $this->load->view('upload_form', $error);
  20.         } else {
  21.             $data = array('upload_data' => $this->upload->data());
  22.             $this->load->view('upload_success', $data);
  23.         }
  24.     }
  25. }







The Upload Directory



最後に、ファイルをアップロードするためのディレクトリを作成します。
CodeIgniterをインストールしたディレクトリに、「uploads」というフォルダを作成。
書き込み権限(777)を付与します。


# cd /path/to/codeigniter3
# mkdir uploads
# chmod 777 uploads






Try it!



これで準備完了です。
ブラウザで、http://[サーバーIP]/uploadにアクセスします。

594_01.png


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

594_02.png


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

594_03.png




複数ファイルのアップロード



マニュアルを読んでいて気になったのは、
http://php.net/manual/ja/features.file-upload.multiple.php
こういった感じで、複数ファイルのアップロードはできるんだろうか?

upload_form.phpを編集します。


  1. <html>
  2. <head>
  3. <title>Upload Form</title>
  4. </head>
  5. <body>
  6. <?php echo $error;?>
  7. <?php echo form_open_multipart('upload/do_upload');?>
  8. <input type="file" name="userfile[]" size="20" />
  9. <input type="file" name="userfile[]" size="20" />
  10. <input type="file" name="userfile[]" size="20" />
  11. <br /><br />
  12. <input type="submit" value="upload" />
  13. </form>
  14. </body>
  15. </html>




適当にファイルを選択してアップロード実行。

594_04.png


エラーになりました。


Message: is_uploaded_file() expects parameter 1 to be string, array given



594_05.png


ライブラリのソースを追ってみましたが、どうも複数ファイルのアップロードは
対応していない模様。

こちらで解決策を見つけました。

Multiple files upload (Array) with CodeIgniter 2.0

$_FILESを書き換え。
initializeを繰り返してdo_upload()を実行しろとのこと。

いっそ、MY_Uploadを作ったほうが速い気もしますが、試してみます。
このコードでうまくアップロード出来ました。


  1. <?php
  2. class Upload extends CI_Controller {
  3.     public function __construct() {
  4.         parent::__construct();
  5.         $this->load->helper(array('form', 'url'));
  6.     }
  7.     public function index() {
  8.         $this->load->view('upload_form', array('error' => ' ' ));
  9.     }
  10.     public function do_upload() {
  11.         
  12.         // 設定
  13.         $config['upload_path']         = './uploads/';
  14.         $config['allowed_types']        = 'gif|jpg|png';
  15.         $config['max_size']             = 10000;
  16.         $config['max_width']            = 1024;
  17.         $config['max_height']         = 768;
  18.         
  19.         $this->load->library('upload', $config);
  20.         
  21.         // 一旦、$_FILESを退避
  22.         $files = $_FILES;
  23.         
  24.         // アップロードされた件数を確認
  25.         $cpt = count($_FILES['userfile']['name']);
  26.         
  27.         // ループしながら$_FILESを上書き
  28.         for ($i = 0; $i < $cpt; $i++) {
  29.             $_FILES['userfile']['name']= $files['userfile']['name'][$i];
  30.             $_FILES['userfile']['type']= $files['userfile']['type'][$i];
  31.             $_FILES['userfile']['tmp_name']= $files['userfile']['tmp_name'][$i];
  32.             $_FILES['userfile']['error']= $files['userfile']['error'][$i];
  33.             $_FILES['userfile']['size']= $files['userfile']['size'][$i];
  34.             
  35.             
  36.             
  37.             if ( ! $this->upload->do_upload()) {
  38.                 $error = array('error' => $this->upload->display_errors());
  39.                 $this->load->view('upload_form', $error);
  40.                 return;
  41.             }
  42.             
  43.         }
  44.         // お試しなので、最後のファイル上だけ表示
  45.         $data = array('upload_data' => $this->upload->data());
  46.         $this->load->view('upload_success', $data);
  47.         
  48.     }
  49.     
  50. }







html5のmultiple属性



multiple属性を追加して、動作を確認してみます。
upload_form.phpをこんな感じに修正しました。


  1. <html>
  2. <head>
  3. <title>Upload Form</title>
  4. </head>
  5. <body>
  6. <?php echo $error;?>
  7. <?php echo form_open_multipart('upload/do_upload');?>
  8. <input type="file" name="userfile[]" size="20" multiple />
  9. <br /><br />
  10. <input type="submit" value="upload" />
  11. </form>
  12. </body>
  13. </html>




594_06.png

コントローラーのコードは修正していません。
これでも複数ファイルのアップロードが行えました。



CodeIgniter 3のユーザーガイド(User Guide)まとめ
関連記事

コメント

プロフィール

Author:symfo
blog形式だと探しにくいので、まとめサイト作成中です。
https://symfo.web.fc2.com/

PR

検索フォーム

月別アーカイブ