生活の跡

個人的な備忘録

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