Laravel – アップロードファイルの取得

概要

ファイル選択要素を持つフォームでファイルを取得する手順を整理する。概要は以下のような流れ。

  • ファイル選択要素を持ったフォームを含むページを表示する
  • ユーザーがファイルを選択してPOSTリクエスト
  • リクエストを介して、サーバーにアップロード・一時保存されたファイルを取得する
  • バリデーションが必要な場合、フォームリクエストを作成して実装

基本例

機能

アップロードファイル取得の機能を、シンプルなコントローラーとビューで確認する。例として、画像ファイルの取得を目的として組み立てていく。

ファイル取得に限って言えば、要点は次の2点。

  • ビューでは、ファイル選択要素を持つフォームでファイルを選択、送信
  • コントローラーでは、アップロードされたファイルをフォームのリクエストから取得

ルーティング

例として以下のようにルーティングを設定する。

設定されるルーティングは以下のとおり。

  • /imagesへのGETリクエストでコントローラーのindexアクションが呼ばれる
    • このアクションでフォームページを表示する
  • フォームからのPOSTリクエストは/imagesに送られ、コントローラーのstoreアクションが呼ばれる
    • 本来はファイル保存を想定したアクションだが、ここではファイルの内容確認のみ行う

コントローラー~フォーム表示

indexアクションではフォームを含むページを表示するだけ。

ビュー~フォームとファイル選択要素の設定

表示するページのテンプレートは以下の通りで以下の2点が要点。

  • FORM要素でenctype="multipart/form-data"を指定している
  • INPUT要素でtype="file"としている

HTML-input-fileを参照

フォームで選択されたファイルの取得

アップロードされたファイルは、メソッド・インジェクションで得られたRequestオブジェクトのfile()メソッドで得られる。file()メソッドの引数にINPUT要素のname属性値を指定することでファイルのオブジェクトを得られる。

以下のアクションでは選択されたファイルの内容をdd()で表示させ、そこで実行を止めている。

ローカルのファイルを選択して送信ボタンを押した結果、上記のdd()で表示された内容を示したのが下記。この例ではJPEGファイルをアップロードしている。

アップロードされたファイルの実体が一時的に保存されるのは/tmpディレクトリーで、php.iniupload_tmp_dirで設定されるようだが、コメントアウトされていた。この場合はルート直下の/tmpになると思われる。

バリデーション

フォームリクエスト

フォーム入力からファイルアップロード時にバリデーションをかける場合、フォームリクエストを使うとコントローラーで行うよりも明快になる。

フォームリクエストはartisanで作成する。

フォームリクエストファイルはapp/Http/Requestsディレクトリーに作成され、このファイルにバリデーションの条件を記述する。条件は配列で書くか、文字列内で'|'で連結してもよい。

フォームリクエスト生成時にはauthorize()の戻り値はfalseになっているが、ここでは無条件にtrueとしている。

ここでは画像ファイルを想定したバリデーションをかけているが、画像以外のファイルを扱う場合は、MIMEタイプをpdfdocなど様々なファイル形式で指定。

また、ファイルサイズをmax:xxxのようにKB単位で制限することもできる。

なおここではファイルがアップロードされていないときは$imagenullとなるが、ファイル指定を必須とする場合はrequiredを指定し、エラーメッセージでファイル指定を促すなどの対応をする。

エラー表示

フォームリクエストでのバリデーションの結果エラーがあると、検証結果が$errorsに記録され、もとのビューにリダイレクトされる。

ここでは、以下のようにフォーム入力のテンプレートで@foreachを使って$errorsの内容を全て表示させている。$errorsの使い方についてはこちらを参照。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です