FuelPHPのフォームからCSVファイルをアップロードしようとしたら「No uploaded files were found. Did you specify "enctype" in your <form> tag?」

概要

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?>

ブラウザで表示すると次のようになります。
f:id:ishii-akihiro:20191016224449p:plain

つまづいた点

まずはドキュメントでFieldSetクラスの仕様をチェックですよね。

Fieldset – クラス – FuelPHP ドキュメント

forgeについては次のように書かれています。
f:id:ishii-akihiro:20191016225329p:plain

なるほど、enctype属性は$configパラメータにarray()で指定すればいいのかな?って思って、はじめは次のように書いていました。

<?php
〜省略〜
$form = Fieldset::forge('csvform', array(
'enctype'=>'multipart/form-data'
)
);
〜省略〜

でもエラー消えない(´・ω・`)
で、ドキュメントの最下部までスクロールすると。。
f:id:ishii-akihiro:20191016225917p:plain

array() in array()。なんで上のほうにまとめて書いてくれないの(笑)
発狂する前に気がつけたのはこちらの記事のおかげです。感謝。

alc.netgamebm.com

タイトルとURLをコピーしました