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

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

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

Frameworkは、アプリケーションソフトを開発する際に、一般的な機能をより簡単に、より早く完了させる事を目的とした、ソフトウェアやライブラリのセットを指します。開発にフレームワークを使用する事で、追加で必要となる機能だけを開発するだけで済む為、開発効率の向上が見込めます。

PHP

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

Laravel 5

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

Q&A

解決済

1回答

827閲覧

Laravel5.4 ファイルアップロード時のエラー処理の対処がわからない

hidepon

総合スコア206

Framework

Frameworkは、アプリケーションソフトを開発する際に、一般的な機能をより簡単に、より早く完了させる事を目的とした、ソフトウェアやライブラリのセットを指します。開発にフレームワークを使用する事で、追加で必要となる機能だけを開発するだけで済む為、開発効率の向上が見込めます。

PHP

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

Laravel 5

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

0グッド

0クリップ

投稿2017/12/07 06:43

編集2017/12/08 03:49

Laravel5.4 でファイルアップロードを試みていますが、エラー処理部分で躓きドキュメントを見ても対処が分かりません。

routes/web.php

Route::get("/about","PagesController@getIndex"); Auth::routes(); Route::get('/home', 'HomeController@index')->name('home'); Route::get('/', 'UploadController@index'); Route::post('/store', 'UploadController@store');

app/Http/Controllers/UploadController.php

<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class UploadController extends Controller { public function index(Request $request) { return view('uploads'); } public function store(Request $request) { $this->validate($request, [ 'datafile' => 'image|max:3000', ]); if ($request->file('datafile')->isValid()) { //アップロード成功時の処理 return view('upload_success'); }else{ //失敗時の処理 return view('upload_error'); } } }

resource/view/uploads.blade.php

@if (isset($message)) <div class="alert">{{$message}}</div> @endif <form action="/store" method="post" enctype="multipart/form-data"> <input type="file" name="datafile"> <input type="submit" value="アップロード" /> {{ csrf_field() }} </form> @section('content') <div class="container"> @if (count($errors) > 0) <div class="alert alert-danger"> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif </div> @endsection

エラー発生
resource/view/upload_error

@section('content') <div class="container"> @if (count($errors) > 0) <div class="alert alert-danger"> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif <form action="/store" method="post" enctype="multipart/form-data"> <input type="file" name="datafile"> <input type="submit" value="アップロード" /> {{ csrf_field() }} </form> </div> @endsection

成功時
resource/view/upload_success

@section('content') <div class="container"> <p>アップロードが成功しました。 </div> @endsection

エラー処理時の方法が分からず困っています。
宜しくお願いいたします。
(追記)
できれば、ほかのフレームワークでやっていたようなことができればうれしいんですが、、、、
/store
に遷移した段階でエラーがあればエラーメッセージとファイル選択のフォームを再度表示。
ファイルが送信されていれば、保存ということをしたいです。

公式ドキュメントではこのような内容が読み取れず、できるのか判断出来ない状況です。
ちなみにほかのフレームワークでは
if (エラーあり){
view(エラーのテンプレート);
}else{
view(成功のテンプレート);
}
としていました。
このような仕組みってできるんでしょうか?
宜しくお願いいたします

(追記2)
ご回答内容を反映しました。

(現在の状況)
routes/web.php

Route::get('/', 'UploadController@index'); Route::post('/add', 'UploadController@add');

app/Http/Controllers/UploadController.php

?php namespace App\Http\Controllers; use Illuminate\Http\Request; class UploadController extends Controller { //view public function index() { return view('index'); } //postした後の処理 public function add(Request $request) { $this->validate($request, [ 'file' => 'image|max:3000', ]); if ($request->file('file')->isValid()) { //アップロード成功時の処理 return view('upload_success'); } } }

resource/view/index.blade.php

<!DOCTYPE html> <html> <head> <title>sample</title> <meta charset="utf-8"> </head> <body> <!-- エラーメッセージ表示部分--> @if ($errors->any()) @foreach ($errors->all() as $error) <p>{{ $error }}</p> @endforeach @endif <!-- エラーメッセージ表示部分--> <form action="/add" method="post" enctype="multipart/form-data"> {{ csrf_field() }} <input type="file" name="file"> <input type="submit"> </form> </body> </html>

resource/view/upload_success.blade.php

<!DOCTYPE html> <html> <head> <title>sample</title> <meta charset="utf-8"> </head> <body> <p>アップロード成功しました</p> </body> </html>

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

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

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

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

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

m.ts10806

2017/12/07 06:53

今現在どこまでできているのでしょうか。分かっている部分、分かっていない部分、調べてみたことを質問本文に追記してください。
m.ts10806

2017/12/07 06:54

「エラー処理」も「どういう仕様か」で組み方が違ってきます。やりたいことをもっと具体的に記述願います。
hidepon

2017/12/07 07:00

ご返答ありがとうございます。ほかのフレームワークからの乗り換えで同様の仕組みが組めるかを確認したいと思っています。追記しますので、ご助言を宜しくお願いいたします。
m.ts10806

2017/12/07 07:20

聞き方が悪かったです・・。「どんなときにエラーとするの?」が「仕様」です。
m.ts10806

2017/12/07 07:22

あ、「どんなときにエラー」は次の段階ですね。
hidepon

2017/12/07 07:23

ファイルアップロードなので、「ファイルが選択されていない」、「拡張子がダメです」「ファイル容量が大きすぎる」という感じで作りたいです・・・・宜しくお願いいたします。そもそも、エラーの有無でテンプレート切り分けってできるのかが心配だったりします。よろしくお願いいたします
m.ts10806

2017/12/07 07:26

確認された公式ドキュメントは「Laravel 5.4 バリデーション」ですか?他にも参考にした先があれば質問に追記してください。
hidepon

2017/12/07 07:30

「Laravel 5.4 バリデーション」を確認しました。いろいろなwebの記事を確認しましたが、バージョン違いでエラーが出たりとかでパニックですwww
m.ts10806

2017/12/07 07:32

laravelはマイナーバージョンアップでも結構別人になってたりするので・・・。
hidepon

2017/12/07 07:33

そうなんですよ・・・。5.1と5.4ではまるで別人ですね・・・orz
m.ts10806

2017/12/07 07:53

回答によってソースコードに変化が生じたのであれば最新の状態をご提示ください。もしかしたら回答者の意図とは違った書き方をしてるかもしれませんし・・・
hidepon

2017/12/07 08:05

そうですね。ほとんど投稿の内容から大きく操作していないですが。。
m.ts10806

2017/12/07 08:18 編集

そもそもですが、uploads.blade.phpにfile選択(input type=file)自体ないような。。。
hidepon

2017/12/07 08:27

viewに記述ミスがありました。あれやこれやを繰り返しているなかでのミスです。すみません。
guest

回答1

0

ベストアンサー

このコードで5.4で動くことを確認しました。

route Route::get('/', 'UploadController@index'); Route::post('/add', 'UploadController@add')->name('add');
viewファイル <!DOCTYPE html> <html> <head> <title>sample</title> <meta charset="utf-8"> </head> <body> <!-- エラーメッセージ表示部分--> @if ($errors->any()) @foreach ($errors->all() as $error) <p>{{ $error }}</p> @endforeach @endif <!-- エラーメッセージ表示部分--> <form action="{{route('add')}}" method="post" enctype="multipart/form-data"> {{ csrf_field() }} <input type="file" name="file"> <input type="submit"> </form> </body> </html>
コントローラー <?php namespace App\Http\Controllers; use Illuminate\Http\Request; class TestController extends Controller { //view public function index() { return view('index'); } //postした後の処理 public function add(Request $request) { $this->validate($request, [ 'file' => 'required|image|max:3000', ]); if ($request->file('file')->isValid()) { //アップロード成功時の処理 } } }

エラーが出た場合は元のviewファイルにリダイレクトし、エラーメッセージを表示してくれます。エラーメッセージを変えたい場合は、resources/lang/en/validation.phpを直接いじるか、追加するなりで対応できます。詳しくはここで解説してます。
https://qiita.com/komatzz/items/422bcba9847ca3a79fe9

一度これに合わせてコードを書きなおしてみてください。

投稿2017/12/07 07:30

編集2017/12/08 04:47
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

hidepon

2017/12/07 07:49

ご返答ありがとうございます。やってみましたが、うまく動作しませんね・・・。いろいろと手を加えていこうと思います。5.3と5.4でもこんなに違うんですね・・・・
退会済みユーザー

退会済みユーザー

2017/12/07 07:52

上手く動作しないとは、具体的になにかエラーが出ているという事ですか?
hidepon

2017/12/07 07:54

申し訳ありません。「Call to a member function isValid() on null」というエラーが出ているです。これは5.4で変わったんですかね???宜しくお願いいたします
退会済みユーザー

退会済みユーザー

2017/12/07 08:00

一度コントローラー側のソースを見てみたいですね。何かわかるかもしれませんし。
hidepon

2017/12/07 08:06

ご返答ありがとうございます。質問部分に追記更新します。よろしくお願いいたします。
hidepon

2017/12/07 08:13

ご回答内容からの編集事項を反映しました。エラー時にエラー用のview (error.blade.php)を作成してエラー内容を埋め込みたいです。 宜しくお願いいたします。
退会済みユーザー

退会済みユーザー

2017/12/07 08:17

ファイルアップロードなのに、type="file"のinput要素が1つもないのは何故ですか?ちなみに $request->file('file')->isValid() の('file')部分はそのinput要素の名前が入ります。
hidepon

2017/12/07 08:28

申し訳ありません。いろいろと試行錯誤しているなかでの転載ミスです。気づきませんでした。ご指摘有難うございます。
退会済みユーザー

退会済みユーザー

2017/12/07 08:31

nameがdatafileになっているので、それに合わせる必要がありますね。回答の方修正しておくので、それで試してもらえませんか?
hidepon

2017/12/07 08:34

ご指摘の直後にこちらでも早速修正をしてみました。有難うございます
退会済みユーザー

退会済みユーザー

2017/12/07 08:38

これでもまだエラーが出てますか?
hidepon

2017/12/07 08:45

なんか挙動がおかしくて・・・・質問欄に現状を記述しますね。本当にすみません。有難うございます。
退会済みユーザー

退会済みユーザー

2017/12/07 08:56

datafileじゃなくて、adtafileになってますね。もしやここが原因では?
hidepon

2017/12/07 09:02

こちらも質問欄への記述ミスです・・・。焦るとだめですね・・・すみません。
hidepon

2017/12/07 09:06

エラー処理時に「Call to a member function isValid() on null」 成功時は画面が真っ白になります。
退会済みユーザー

退会済みユーザー

2017/12/07 09:16

気づくの遅れました・・・。バリデーションのfile部分をdatafileに直してみてくれませんか?
hidepon

2017/12/07 09:23

有難うございます。修正してみましたが、うまく動作しないようです。 「Call to a member function isValid() on null」というエラー表示になります
hidepon

2017/12/07 09:35

意外と難しいですね・・・5.3 と5.4の違いなんでしょうか???
退会済みユーザー

退会済みユーザー

2017/12/07 09:42

バージョン違いではないとは思うんですけどね。最新版で動かしたら動いたので・・。inputのname部分とバリデーションの部分とif分のところで完全に一致してるんですよね?
hidepon

2017/12/07 10:04

質問欄に最新の状態で更新しました。name部分とか一致しているはずなんですが・・・
退会済みユーザー

退会済みユーザー

2017/12/07 10:27

5.4で検証してないので、しばらく調査してみます。何かわかったらコメントします。お役に立てずすみません・・・
hidepon

2017/12/07 15:11

いえいえ、有難うございます。本当によくわからなくて・・・本当にありがとうございます。自分も試行錯誤でしています
退会済みユーザー

退会済みユーザー

2017/12/08 01:03

回答更新したので、試してみてください
hidepon

2017/12/08 03:42

有難うございます。。ほぼほぼコピペでやってみましたが、うまくいきません。routeとかファイル名の変更をした内容を質問部分の最下部に追記します
hidepon

2017/12/08 03:59

routeの設定を変更して、viewの設定を変更したのですが、成功時のファイルに記述した内容が表示されないです。また失敗時の処理も「Call to a member function isValid() on null」とlaravelの処理になってしまいます
退会済みユーザー

退会済みユーザー

2017/12/08 04:20

ルート部分とform action部分を変えたので、それで試してもらえますか?あと成功時のファイル名がi.blade.phpになってますが、書き間違いでしょうか。
hidepon

2017/12/08 04:26

有難うございます。viewの名称の部分は書き間違えです。upload_success.blade.phpです。すみません。チョンボが多くて・・・やってみます。
退会済みユーザー

退会済みユーザー

2017/12/08 04:30

まさかとは思うんですが、確認するときにちゃんとファイルを選択して送信してますよね?何も選択しないで送信したら「Call to a member function isValid() on null」のエラーが出るのは今確認できました。もしこの辺りもバリデーションするならコードを足す必要があります。
hidepon

2017/12/08 04:33

何も選択していない場合は「Call to a member function isValid() on null」と出るんです。これは当然の結果だったということですね・・・。説明不足ですみません。最終的には「未選択」と「容量オーバー」「拡張子ダメです」の3点はチェックしたいと思っています。成功時に「upload_success.php」が表示されていないようです。この理由がわからないままです
退会済みユーザー

退会済みユーザー

2017/12/08 04:38

こちらでも同じ状況にしましたが、正しくviewファイルが表示されました。upload_success.phpではなく、upload_success.blade.phpとなっていますか?
hidepon

2017/12/08 04:40

そのとおりでuoload_success.blade.phpになっています。もう一度確認してみます。本当にすみません。
退会済みユーザー

退会済みユーザー

2017/12/08 04:44

upload_success.blade.phpとなっているなら return view('upload_success'); とすれば必ず表示されるはずです。
hidepon

2017/12/08 04:45

うまくいきました!!!ありがとうございます。変な文字@section("cotents")という感じの文字が入っていました。これが原因だったようです。すみません。「ファイル選択がない」「容量オーバー」「拡張子ダメ」のエラー処理もやってみようと思います
退会済みユーザー

退会済みユーザー

2017/12/08 04:48

ファイル項目を必須にする場合はバリテーションにちょっと追加するだけですね。コード変えてみたんで試してみてください。
hidepon

2017/12/08 04:53

えっ!?こんな簡単な感じでバリデーションできるんですか!?素晴らしいです。本当に有難うございました。これからも勉強を進めていきます。心折れそうでした。。。orz
退会済みユーザー

退会済みユーザー

2017/12/08 04:56

いやー解決できてよかった(笑) バリデーションの項目は公式ドキュメントに載ってるので読んでみるといいですよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問