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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Ajax

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

2934閲覧

Laravelの画像アップロードバリデーション

osamuya

総合スコア241

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Ajax

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2019/06/16 01:38

Laravel5で画像アップロードの実装を行っております。アップロードの際はVue.js + AxiosでAjax送信を行っております。
画像をアップロードするときに画像に対するRequiedバリデーションを設定していないにもかかわらずバリデーションが反応してしまうという現象があって、どん詰まりました。
PHP側で画像ファイルを受け取った際に、空のデータではなくゴミのようなデータが送信されてしまっているのかな。。。と思いいろいろデバックしてみましたが、$request->file('file0')自体は何も入っていないのですが、Validationは反応してしまっているのです。
こちら同じ現象に出くわした方いましたら、なにかしらご教授お願いしたいです。

fileバリデーションが反応しているので、何かしら壊れたデータ的なものが送信されてしまっていると思うのですが。。。Vue側でのデータはfile0: null,で初期化しています。

html

1<div id="test"> 2 <input type=text v-model="name"> 3 <p>@{{error_message_name}}</p> 4 <input @change="selected_file0" type="file" name="file0"> 5 <p>@{{error_message_file0}}</p> 6 <input @change="selected_file1" type="file" name="file1"> 7 <p>@{{error_message_file1}}</p> 8 <button type="button" @click="post($event)">Submit</button> 9 </div> 10 11 <script> 12 var app = new Vue({ 13 el: '#test', 14 data: { 15 name: "default name", 16 error_message_name: "", 17 file0: null, 18 file1: null, 19 error_message_file0: "", 20 error_message_file1: "", 21 }, 22 methods: { 23 selected_file0: function(event){ 24 event.preventDefault(); 25 // console.log(event.target.files); 26 let files = event.target.files; 27 this.file0 = files[0]; 28 console.log(this.file0); 29 }, 30 selected_file1: function(event){ 31 event.preventDefault(); 32 // console.log(event.target.files); 33 let files = event.target.files; 34 this.file1 = files[0]; 35 console.log(this.file1); 36 }, 37 post: function(){ 38 console.log("submit"); 39 40 let params = new FormData(); 41 params.append('name', this.name); 42 params.append('file0', this.file0); 43 params.append('file1', this.file1); 44 params.append('_token', '{{csrf_token()}}'); 45 46 var config = { 47 headers: { 48 'content-type': 'multipart/form-data' 49 } 50 }; 51 axios.post( 52 '/v2/form/tutorial/store', 53 params, 54 config 55 ).then(response => { 56 if (response.status === 200) { 57 console.log(response); 58 } 59 }).catch(e => { 60 console.log(e.response.data.errors.file0); 61 console.log(e.response.data.errors.file1); 62 console.log(e.response.data.errors.name); 63 this.error_message_name = e.response.data.errors.name; 64 this.error_message_file0 = e.response.data.errors.file0; 65 this.error_message_file1 = e.response.data.errors.file1; 66 }); 67 } 68 } 69 }); 70 </script>

php

1public function tutorial_store(Request $request) { 2 3 $this->validate($request, [ 4 'name' => 'required', 5 'file0' => 'file|image|mimes:jpeg,gif,png|dimensions:min_width=100,min_height=100,max_width=3600,max_height=3600', 6 'file1' => 'file|image|mimes:jpeg,gif,png|dimensions:min_width=100,min_height=100,max_width=3600,max_height=3600', 7 ]); 8 9 // なんか保存の処理 10 $path = $request->file('file0')->store('public/pics'); 11 $path = $request->file('file1')->store('public/pics'); 12 13 return view("develop.form_tutorial_store"); 14}

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

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

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

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

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

hentaiman

2019/06/16 01:46

同じ現象の人に回答希望ってこ事なので回答ではなくこっちに書きます。 問題が起きたら低レベルなコードに戻して問題の切り分けしましょう。 vueとかajaxとかを使わないで動作テストをしましょう。 素のhtmlでもvalidationが反応するならphpの問題です。 ajaxにした時にvalidationが反応するならjavascriptの問題です。 vueを組み込んだ時にvalidationが反応するならvueの問題です。
osamuya

2019/06/16 03:02

vueとかajaxとかを使わないで動作テストでは問題ないです。jQueryでやっても問題なかったです。と考えるとVue.jsの問題なのかなぁというところまでは来てます。ただVue.jsでファイル送信時のデータの初期化というのがどこで行ってよいものなのかというのが全くわからないといったところです。
osamuya

2019/06/16 03:04

すみません。二重投稿しておりました。1つ目は削除以来出しました。
mikkame

2019/06/16 04:11

> fileバリデーションが反応しているので、何かしら壊れたデータ的なものが送信されてしまっていると思うのですが。。。 思う・・・じゃなくて chromeのdeveloper consoleで確認すればいいのでは?
hentaiman

2019/06/16 05:25

ぶっちゃけvue分からん自分が軽く見ただけでもnull送ってるからvalidation引っかかってんだろ程度には思う mikkameさんの言う通り手間を惜しまずにデバッグをおすすめする 自分だったらまずはvalidation動かさない状態でphp側でログ出して確認する
osamuya

2019/06/16 05:54

ログで出すと送信している値は空なのに、Validationにひっかかかっている状態ですね。。。デバック惜しんでいるのではなくて、だいたいすべてやってしまった感はあります。。
hentaiman

2019/06/16 06:02

そしたらnullが送られているわけではないって事までは確認済みってことなのね
osamuya

2019/06/16 06:07

chromeのdeveloper consoleでは当然、nullが入ってきます。送信すると$request->file('file0')は空です。(というのは上述の通りなのですが。。。)ここらが本当にわからないところでして。。 ちなみに、 file0: nullでは、バリデーションすべてが反応し、 file0: 0では、fileのバリデーションだけが反応し、 file0: ""では、バリデーションすべてが反応し、 file0: []では、fileのバリデーションだけが反応するといった感じです。 ここがなんとか確かな空にできないものかと。。
hentaiman

2019/06/16 06:10

一番最初に回答に書こうと思ったことそのまんま書くけど いらない要素ならそもそも送る必要がないのでajaxの送信データに含める必要がないのでfileの無いinputは消す事 nullを送っているように見えるので、それをしたいならvalidationでnullableをつけること その代わりfileでnullが入ってる時の処理は追加する事 vueの問題ではなく作り方の問題だと思う
mikkame

2019/06/16 06:11

> ここがなんとか確かな空にできないものかと。 とりあえず if (this.file0) params.append('file0', this.file0); ってすればいいんじゃない?
osamuya

2019/06/16 14:18

> mikkameさん 解決しました。。これしきのことで結構時間かかってしまいました。正にif (this.file0) params.append('file0', this.file0);の追加と、 Laravelのコントローラ側の「$path = $request->file('file0')->store('public/pics');」がいけなかったようです。ここでも、 if ($request->file('file0')) { $path0 = $request->file('file0')->store('public/pics'); } というように中身を確認してから実行するとうまくいきました。 ありがとうございます。
guest

回答1

0

ベストアンサー

コメント欄で既にnullableに関しての言及がありますが、
項目の値が空の場合に、その項目のバリデーションのルールを適用したくない時は、nullableを指定してください。
Laravel 5.8 バリデーション nullable

Laravel5.8のソースコード的には、以下あたりが関係します。
laravel isNotNullIfMarkedAsNullable

投稿2019/06/17 09:56

編集2019/06/17 09:56
aro10

総合スコア4106

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問