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

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

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

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

Laravel 5

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

Q&A

1回答

2163閲覧

laravelのCRUDで画像をアップロードする方法

SENNA0510

総合スコア10

PHP

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

Laravel 5

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

0グッド

2クリップ

投稿2019/03/01 05:56

LaravelでCRUDの勉強をしています。
以下に詳細を記載しますので、原因や対策など教えて頂けると助かります。。。

■投稿の流れ
入力フォーム → 確認画面 → 完了画面

■エラーになる部分
確認画面までは画像のパスが取得できていますが
そこから登録ボタンをクリックするとエラー画面になります。(完了画面に遷移しない)

■エラー内容
Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException
No message
上記のような文が出てくるので何が原因なのかもわからない状態です。

■試したこと
・入力フォーム、確認画面ともに「enctype="multipart/form-data"」を指定
・「php aritsan storage:link」コマンド実行

■コードは以下
create.blade.php

php

1@extends('layouts.app') 2 3@section('content') 4<div class="clientWrap"> 5<h3>Add</h3> 6<p> 7 <span class="label label-danger">入力画面</span> -> 確認画面 -> 完了画面 8</p> 9 10<form class="" onkeypress=""action="{{ url('/client/confirm') }}" method="post" enctype="multipart/form-data"> 11 {{ csrf_field() }} 12 <p> 13 <input type="text" name="name" placeholder="名前" value="{{ old('name') }}"> 14 @if ($errors->has('name')) 15 <span class="error">{{ $errors->first('name') }}</span> 16 @endif 17 </p> 18 <p> 19 <input type="text" name="age" placeholder="年齢" value="{{ old('age') }}"> 20 @if ($errors->has('age')) 21 <span class="error">{{ $errors->first('age') }}</span> 22 @endif 23 </p> 24 <p> 25 <input type="text" name="email" placeholder="アドレス" value="{{ old('email') }}"> 26 @if ($errors->has('email')) 27 <span class="error">{{ $errors->first('email') }}</span> 28 @endif 29 </p> 30 <p><textarea name="memo" rows="8" cols="80" placeholder="備考">{{ old('memo') }}</textarea></p> 31 32 <p> 33 <label class="col-sm-3 control-label" for="image">画像アップロード</label> 34 <input type="file" name="photo" class="form-control{{ $errors->has('image') ? ' is-invalid' : '' }}" placeholder="ファイル"> 35 @if ($errors->has('image')) 36 <span class="invalid-feedback"> 37 <strong>{{ $errors->first('image') }}</strong> 38 </span> 39 @endif 40 </p> 41 42 43 44 <input type="submit" name="" value="確認"> 45 46</form> 47</div> 48@endsection

confirm.blade.php

php

1@extends('layouts.app') 2 3 4@section('content') 5<div class="clientWrap"> 6 <h3>confirm</h3> 7 <p> 8 入力画面 -> <span class="label label-danger">確認画面</span> -> 完了画面 9 </p> 10 11 <form class="" onkeypress=""action="{{ url('/client/finish') }}" method="post" enctype="multipart/form-data"> 12 13 <input type="hidden" name="_token" value="{{ csrf_token() }}"> 14 <input type="hidden" name="name" value="{{ $name }}"> 15 <input type="hidden" name="email" value="{{ $email }}"> 16 <input type="hidden" name="age" value="{{ $age }}"> 17 <input type="hidden" name="memo" value="{{ $memo }}"> 18 <input type="hidden" name="photo" value="{{ $photo }}"> 19 20 <p>名前:{{$name}}</p> 21 <p>年齢:{{$age}}</p> 22 <p>メールアドレス:{{$email}}</p> 23 <p>備考:{!! nl2br(e($memo)) !!}</p> 24 <p>画像のパス:{{ $photo }}</p> 25 26 27 <input type="submit" name="action" value="戻る"> 28 <input type="submit" name="action" value="登録"> 29 30 </form> 31</div> 32@endsection

ClientsController.php

php

1 2<?php 3 4namespace App\Http\Controllers; 5 6use Illuminate\Http\Request; 7use App\Client; 8use App\Http\Requests\ClientRequest; 9 10class ClientsController extends Controller 11{ 12 13 public function __construct() { 14 $this->middleware('auth'); 15 } 16 17 // 18 public function index() { 19 $clients = Client::latest()->get();//Clientモデルにあるデータを登録の新しい順に取得してくる 20 return view('client.list')->with('clients', $clients); 21 } 22 23 public function show(Client $client) { 24 return view('client.show')->with('client', $client); 25 } 26 27 public function create() { 28 return view('client.create'); 29 } 30 31 public function confirm(ClientRequest $request) { 32 $data = $request->all(); 33 34 return view('client.confirm')->with($data); 35 } 36 37 public function store(ClientRequest $request) { 38 $action = $request->get('action');// name=action の value名を取得 39 $input = $request->except('action');// 入力内容を取得 40 41 if($action === '登録') { 42 $path = "app/".$request->file('image')->store('public/images'); 43 $client = new Client(); 44 $client->clientName = $request->name; 45 $client->clientAge = $request->age; 46 $client->clientEmail = $request->email; 47 $client->clientMemo = $request->memo; 48 $client->clientImagePath = basename($path); 49 $client->save(); 50 51 return view('client.finish'); 52 } else { 53 return redirect('/client/create')->withInput($input); 54 } 55 56 } 57}

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

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

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

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

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

guest

回答1

0

MethodNotAllowedHttpException

は、route設定に記述されていないmethodで、URLにアクセスした際に発生するエラーですね。

で、

■エラーになる部分

確認画面までは画像のパスが取得できていますが
そこから登録ボタンをクリックするとエラー画面になります。(完了画面に遷移しない)

とのことなので、恐らく

完了画面にPOSTし、バリデーションエラーが発生。
それにより、1つ前の画面confirmにで戻ってくるが、postしか許可されていないので、MethodNotAllowedHttpExceptionが発生。。。

という状態ではないかと推測します。

上記を踏まえて、気になるところと言えば、使っているFormRequestが同じだということでしょうか。

特に画像の項目ですが、

入力画面から送信される<input type="file" name="photo">
※photoは文字列です。tmpに一時ファイルが存在します。

と、

確認画面から送信される<input type="hidden" name="photo" value="{{ $photo }}">
※photoは文字列です。tmpに一時ファイルはありません。

の差を、ClientRequestの中できちんと処理分けされていますか?


コメント受けての追記です。

フレームワークを使わずに、ファイルのアップロード処理を作成されたことはありますか?
もしなければ、まずはそちらから作ってみることをお勧めします。
ここはphpを使う上で基本的なことなので、フレームワークをつかう前に理解しておくべき部分だと思います。

これが出来るようになれば、<input type="file" name="photo">と、<input type="hidden" name="photo">の差が分かるはずです。
そして、この差が分かれば、今回のエラーについても原因が見えてくるはず。。。

確認画面から送信される<input type="hidden" name="photo">は、
FormRequestのルールに記載されている

'photo' => 'required|file|image|mimes:jpeg,png,jpg,gif|max:2048'

この、file|image|mimes:jpeg,png,jpg,gifのチェックを突破できないので、バリデーションエラーが発生しています。

投稿2019/03/01 07:05

編集2019/03/08 02:25
mix-peach

総合スコア1910

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

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

SENNA0510

2019/03/07 07:44

ご回答ありがとうございました。 送って頂いた助言を読みClientRequesの中身を見てみましたが 処理分けして出来てないと思います。 以下がコードです。 普通のバリデーション設定しか記述してないです。 入力画面から送信される<input type="file" name="photo">と 確認画面から送信される<input type="hidden" name="photo" value="{{ $photo }}">の 処理分けという点が理解できないのですが 具体的にはどのようにしたらよいのでしょうか。 お手数ですが、、、教えて頂けると幸いです。 ```php <?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class ClientRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return true; } /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ // 'name' => 'required|min:2', 'age' => 'required|numeric', 'email' => 'required|email', 'photo' => 'required|file|image|mimes:jpeg,png,jpg,gif|max:2048' ]; } public function messages() { return [ 'required' => '必須です', 'min' => '2文字以上です', 'numeric' => '数字で入力してください', 'email' => 'メールアドレス形式で入力してください', 'photo' => '対応している形式でアップしてください' ]; } } ```
mix-peach

2019/03/08 02:25

追記してみたので、ご確認ください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問