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

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

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

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

1回答

872閲覧

laravelで、画像を任意に投稿したい。

fork_

総合スコア43

Laravel

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2020/04/10 09:15

編集2020/04/10 10:00

現在Laravelで掲示板アプリを作成しているのですが、投稿一覧内で投稿、編集、削除が完結するようにしてます。

現状、テキストと画像の両方に値が入ってないと登録できない状況です。
やりたいこととしては、テキストだけ投稿でき、任意で画像を投稿できるようにしたいです。

※補足ですが、「テキストだけ」投稿しようとすると、以下の画面でエラーになります。おそらく、storeメソッドを呼んでるのに、

//s3アップロード開始 $image = $request->file('image'); // バケットの`test`フォルダへアップロード $path = Storage::disk('s3')->putFile('test', $image, 'public'); // アップロードした画像のフルパスを取得 $post->image_path = Storage::disk('s3')->url($path);

上記の部分に何も入っていないためエラーになったと推測します。

イメージ説明

もし、image_pathがnullだったら、そのままテキストだけ投稿できる。
もし、image_pathがnullではなかったら、テキストと画像の両方投稿できる。
この条件を、コントローラーで制御しようと思ったのですが、なかなか上手くいかず...
テーブル定義では、image_pathは基本はnullの状態です。s3に画像をアップロードする機能をつけてます。
ご教示のほど、よろしくお願いいたします。

関係するテーブル定義はこちらになります。

posts | CREATE TABLE `posts` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `user_id` int NOT NULL, `text` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `image_path` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`) )

該当のコードがこちらになります。

index

1 2{{-- 投稿フォーム表示 --}} 3 <form action="/" method="post" enctype="multipart/form-data"> 4 {{ csrf_field() }} 5 <div class="text"> 6 <div> 7 <textarea name="text" rows="8" cols="80" placeholder="今何したい?"></textarea> 8 <label for="myImage"><i class="fas fa-image fa-2x"></i></label> 9 <input type="file" name="image" value="" id="myImage" accept="image/*" style="display:none"> 10 <img id="preview"> 11 12 {{ csrf_field() }} 13 </div> 14 </div> 15 {{-- 投稿ボタン表示 --}} 16 <div class="button"> 17 <button type="submit" class="index-button">&#xf044; 投稿する</button> 18 </div> 19 </form>

PostsController

1public function store(Request $request) 2 { 3 $request->validate([ 4 'text' => 'required', 5 ]); 6 7 // モデルからインスタンスを生成 8 $post = new Post; 9 // postsテーブルのtextに、フォームから送られたtextを保存する 10 $post->text = $request->text; 11 // userテーブルのidを、postsテーブルのuser_idとして保存する 12 $post->user_id = $request->user()->id; 13 //s3アップロード開始 14 $image = $request->file('image'); 15 // バケットの`test`フォルダへアップロード 16 $path = Storage::disk('s3')->putFile('test', $image, 'public'); 17 // アップロードした画像のフルパスを取得 18 $post->image_path = Storage::disk('s3')->url($path); 19 // 保存 20 $post->save(); 21 // 保存後 一覧ページへリダイレクト 22 return redirect('/'); 23 24 } 25

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

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

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

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

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

guest

回答1

0

ベストアンサー

php

1public function store(Request $request) 2 { 3 $request->validate([ 4 'text' => 'required', 5 ]); 6 7 $post = new Post; 8 $post->text = $request->text; 9 $post->user_id = $request->user()->id; 10 11 if ($request->hasFile('image')) { 12 $image = $request->file('image'); 13 $path = Storage::disk('s3')->putFile('test', $image, 'public'); 14 $post->image_path = Storage::disk('s3')->url($path); 15 } 16 17 $post->save(); 18 return redirect('/'); 19 }

イメージ説明

イメージ説明

投稿2020/04/10 09:42

編集2020/04/10 11:33
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

fork_

2020/04/10 09:53

できました!ありがとうございます。 追加で申し訳ありません。このような条件を言語化して検索するときに、どのような検索ワードで検索すると良いでしょうか??
退会済みユーザー

退会済みユーザー

2020/04/10 11:33 編集

$image = $request->file('image'); を見ると、Requert クラスの file メソッドであることは自明です。 そうすると、Laravel の リクエストクラスに似た機能があることが想像できます。 回答の画像参照 https://readouble.com/laravel/7.x/ja/requests.html ここを読むとありそうと見当をつける
fork_

2020/04/10 12:38

Requestクラスから公式ドキュメントを深掘りしていくと見えてくるのですね.... 理解が深まりました。 ご丁寧な解説、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問