概要
FuelPHP で CSVファイル(※)のアップロードに挑戦しました。
フォームに<input type="file">
のフィールドを作って submit すればいいはずが、エラーになってしまいました。
(※)今回のエラーは、CSVに限った話ではありません。本記事のコードにCSVっぽい変数が出てきますが、気にしないでください。
環境
- FuelPHP 1.8.2
- Google Chrome
エラー内容
No uploaded files were found. Did you specify “enctype” in your <form> tag?
意訳すると、「アップロードされたファイルが見つかりません。てか、<form>タグに”enctype”属性を指定しましたか?」みたいなこと言ってますこの人。
解決方法
言われた通りに<form>タグに”enctype”属性を指定すればOKでした。<input type="file">
のフィールドを作る場合は、フォームに”enctype”属性を指定する必要があるようです。
ただ、FuelPHPでの設定方法が分からず、しばらく悩みました。。コードは次の通りです(関係ない部分のコードは省いています)。
コントローラ
Fieldset::forge
の書き方がポイントです。
APP_PATH/classes/controller/csv.php
<?php class Controller_Csv extends Controller_Template { public function action_index() { //フォームを作成 $form = Fieldset::forge('csvform', array( 'form_attributes' => array( 'enctype'=>'multipart/form-data' ) ) ); //フォームに項目を追加 $form->add('csvfile', 'CSVファイル', array('type'=>'file', 'placeholder'=>'CSVファイル')) ->add('submit', '', array('type'=>'submit', 'value'=>'一括登録')); //ビューを作成(テンプレートファイルを利用した場合の書き方になっています) $this->template->head = View::forge('layout/head'); $this->template->header = View::forge('layout/header'); $this->template->footer = View::forge('layout/footer'); $this->template->content = View::forge('contents/csv'); $this->template->set_global('csvform', $form->build(''), false); } } ?>
ビュー
コントローラから受け取ったフォームだけ表示する単純なビューです。
APP_PATH/views/contents/csv.php
<?=$csvform?>
ブラウザで表示すると次のようになります。
つまづいた点
まずはドキュメントでFieldSetクラスの仕様をチェックですよね。
Fieldset – クラス – FuelPHP ドキュメント
forgeについては次のように書かれています。
なるほど、enctype属性は$configパラメータにarray()で指定すればいいのかな?って思って、はじめは次のように書いていました。
<?php 〜省略〜 $form = Fieldset::forge('csvform', array( 'enctype'=>'multipart/form-data' ) ); 〜省略〜
でもエラー消えない(´・ω・`)
で、ドキュメントの最下部までスクロールすると。。
array() in array()。なんで上のほうにまとめて書いてくれないの(笑)
発狂する前に気がつけたのはこちらの記事のおかげです。感謝。