質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

1回答

1705閲覧

laravelでajaxでアップロードしたファイルのrequiredバリデーションを実行したい

tarou2

総合スコア28

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2022/02/21 04:24

編集2022/02/21 05:31

前提・実現したいこと

larvelでajaxを使ってcsvファイルをアップロードして、データベースに挿入する機能を実装しています。
正しいcsvファイルをアップロードして、データベースにデータが挿入されることはできました。

バリデーションを行うためにrequiredmimetypes:text/plainルールを使用しています。ファイル未選択の状態でフォームを送信するとmimetypsのバリデーションだけに引っかかり、requiredのバリデーションルールには引っかかりません。どうすればファイル未選時にrequiredに引っかかるようになるでしょうか。

該当のソースコード

CsvImportController.php

php

1 public function import(Request $request) { 2 $validator = Validator::make($request->all(), [ 3 'csv_file' => ['required', 'mimetypes:text/plain'], 4 ]); 5 6 /* ファイル未選択の状態でもrequiredに関するエラーは存在しない */ 7 if ($validator->fails()) 8 return response()->json([ 9 'success' => false, 10 'flash_msg' => 'バリデーションに失敗しました。', 11   'validation error messages' => $validator->errors()->all(), 12 ], 400); 13 /* 省略 */ 14}

upload-csv.js

js

1$(function() { 2 $('#upload_csv_btn').on('click', function() { 3 4 // csrfをセット 5 $.ajaxSetup({ 6 headers: { 7 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') 8 } 9 }); 10 11 // uploadするcsvファイル情報追加 12 let fileData = document.getElementById('csv_file').files[0]; 13 let formData = new FormData(); 14 formData.append('csv_file', fileData); 15 16 $.ajax({ 17 type: 'POST', 18 url: $('#upload_csv_btn').data('upload-url'), 19 data: formData, 20 processData: false, 21 contentType: false, 22 success: function (data) { 23 console.log('成功しました'); 24 }, 25 error: function (data) { 26 console.log('失敗しました'); 27 }, 28 /* flash message表示処理は省略 */ 29 }); 30 }); 31}); 32

index.blade.php

php

1 2<x-app-layout> 3 <x-slot name="header"> 4 <h2 class="font-semibold text-xl text-gray-800 leading-tight"> 5 {{ __('Dashboard') }} 6 </h2> 7 </x-slot> 8 9 <div class="py-12"> 10 <div class="max-w-7xl mx-auto sm:px-6 lg:px-8"> 11 <div class="bg-white overflow-hidden shadow-sm sm:rounded-lg"> 12 <div class="p-6 bg-white border-b border-gray-200"> 13 <x-auth-validation-errors class="mb-4" :errors="$errors" /> 14 <form action="{{ route('admin.records.csv.upload') }}" method="post" enctype="multipart/form-data"> 15 <div class="-m-2"> 16 <div class="p-2 w-1/2 mx-auto"> 17 <div> 18 <label for="csv_file" class="leading-7 text-sm text-gray-600">csvファイル</label> 19 <input type="file" id="csv_file" name="csv_file" required accept=".csv" class="w-full bg-gray-100 bg-opacity-50 rounded border border-gray-300 focus:border-green-500 focus:bg-white focus:ring-2 focus:ring-green-200 text-base outline-none text-gray-700 py-1 px-3leading-8 transition-colors duration-200 ease-in-out"> 20 </div> 21 </div> 22 <div class="p-2 w-full mt-4 flex justify-around"> 23 <button type="button" onclick="location.href='{{ route('admin.records.index') }}'" class="bg-gray-200 border-0 py-2 px-8 hover:bg-gray-400 rounded text-lg">戻る</button> 24 <button type="button" id="upload_csv_btn" class="text-white bg-green-500 border-0 py-2 px-8 hover:bg-green-600 rounded text-lg" data-upload-url="{{ route('admin.records.csv.upload') }}">アップロード</button> 25 </div> 26 </div> 27 </form> 28 </div> 29 </div> 30 </div> 31 </div> 32 <script type="text/javascript" src="{{ mix('js/upload_csv.js') }}"></script> 33 <script type="text/javascript" src="{{ mix('js/upload_button.js') }}"></script> 34</x-app-layout> 35

補足情報(FW/ツールのバージョンなど)

laravel8

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

原因はJS側にあります。
ファイルがない場合、let fileData = document.getElementById('csv_file').files[0];の結果はundefinedになります。
そして、formData.append('csv_file', fileData);undefinedcsv_fileの値としているので、それでリクエストを行います。

そのため、requreidに引っかかっていないです。

Networkタブからリクエスト内容をチェックするとおそらくcsv_file: undefinedのようになっているかと思います。
Laravelにて、$request->csv_fileの値がどのようになっているか確認して進めていくとよいかと思います

投稿2022/02/21 19:27

natsume2233

総合スコア225

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tarou2

2022/02/21 21:54

ありがとうございました。 `fileData`が`undefined`の時は`formData`に`appned`しないようにすると、ファイル未選択時に`required`に引っかかりました。`undefined`はファイルがあると判断されてしまうんですね。
natsume2233

2022/02/22 02:46

> `undefined`はファイルがある requiredで引っかかるのが ``` 値がnullである。 値が空文字列である。 値が空の配列か、空のCountableオブジェクトである。 値がパスのないアップロード済みファイルである。 ``` です。今回の場合、Laravelとしては`$request->csv_file`の中身は`undefined`という文字列が渡ってきているので`required`に引っかかっていないだけになります
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問