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

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

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

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

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

1回答

409閲覧

Laravel で画像投稿機能を実装したい(初学者)

Take.Y

総合スコア12

Laravel

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

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2020/07/14 07:06

前提・実現したいこと

Laravel を用いて画像投稿機能を実装したいです。
storeAs メソッドを用いて form で送信された画像ファイルを storage フォルダに保存し、表示させたいです。

発生している問題・エラーメッセージ

storage フォルダ内にファイルが保存がされずに困っています。
SQLで確認したところ、データベース内にフォルダの url を保存することには成功しているようです。

該当のソースコード

php

1<?php 2 3namespace App\Http\Controllers; 4 5use App\User; 6 7use Illuminate\Http\Request; 8 9use App\Record; 10 11class RecordsController extends Controller 12{ 13 /** 14 * Display a listing of the resource. 15 * 16 * @return \Illuminate\Http\Response 17 */ 18 public function index() 19 { 20 $data = []; 21 if (\Auth::check()) { // 認証済みの場合 22 // 認証済みユーザを取得 23 $user = \Auth::user(); 24 // ユーザの投稿の一覧を作成日時の降順で取得 25 $records = Record::all()->sortByDesc("created_at"); 26 27 $data = [ 28 'user' => $user, 29 'records' => $records, 30 ]; 31 } 32 33 // Welcomeビューでそれらを表示 34 return view('welcome', $data); 35 } 36 37 /** 38 * Show the form for creating a new resource. 39 * 40 * @return \Illuminate\Http\Response 41 */ 42 public function create(Request $request) 43 { 44 $post = new Post(); 45 $post->user_id = Auth::user()->id; 46 $post->title = $request->title; 47 $post->content = $request->content; 48 //写真用 データベースに保存 49 $post->image = $request->image->storeAs('public/post_images', Auth::user()->id.'.jpg'); 50 $post->save(); 51 52 return redirect()->route('posts.detail', [ 53 'id' => $post->id, 54 ]); 55 56 return view('records.post'); 57 58 } 59 60 /** 61 * Store a newly created resource in storage. 62 * 63 * @param \Illuminate\Http\Request $request 64 * @return \Illuminate\Http\Response 65 */ 66 public function store(Request $request) 67 { 68 69 $request->validate([ 70 'title' => 'required|max:20', 71 'time' => 'required', 72 'comment' => 'required|max:225', 73 'image' => 'image|file', 74 ]); 75 76 $request->user()->records()->create([ 77 'title' => $request->title, 78 'time' => $request->time, 79 'comment' => $request->comment, 80 'image' => $request->image, 81 ]); 82 83 84 return back(); 85 } 86 87 /** 88 * Display the specified resource. 89 * 90 * @param int $id 91 * @return \Illuminate\Http\Response 92 */ 93 public function show($id) 94 { 95 // idの値でユーザを検索して取得 96 $user = User::findOrFail($id); 97 98 // 関係するモデルの件数をロード 99 $user->loadRelationshipCounts(); 100 101 // ユーザの投稿一覧を作成日時の降順で取得 102 $records = $user->records()->orderBy('created_at', 'desc')->paginate(10); 103 104 // ユーザ詳細ビューでそれらを表示 105 return view('users.show', [ 106 'user' => $user, 107 'records' => $records, 108 ]); 109 } 110 public function showCreateForm() 111 { 112 return view('records/post'); 113 } 114 115 public function detail(Post $post) 116 { 117 return view('posts/detail', [ 118 'user_id' => $post->user_id, 119 'title' => $post->title, 120 'content' => $post->content, 121 'image' => str_replace('public/', 'storage/', $post->image), 122 ]); 123 } 124 125 126 127}

php

1@extends('layouts.app') 2 3@section('content') 4 5 @if (Auth::check()) 6 {!! Form::open(['route' => 'records.store', 'files' => true]) !!} 7 {{ csrf_field() }} 8 </br> 9 <div class="form-group"> 10 <p>訪れた場所(記入例 : Japan / Tokyo)</p> 11 {!! Form::text('title', old('title'), ['class' => 'form-control', 'rows' => '1']) !!} 12 </br> 13 <p>日付</p> 14 {!! Form::date('time', old('time'), ['class' => 'form-control', 'rows' => '1']) !!} 15 </br> 16 <p>コメント</p> 17 {!! Form::textarea('comment', old('comment'), ['class' => 'form-control', 'rows' => '1']) !!} 18 </br> 19 {!! Form::file('image')!!} 20 </br> 21 </br> 22 {!! Form::submit('Post', ['class' => 'btn btn-primary btn-block']) !!} 23 </div> 24 {!! Form::close() !!} 25 26 @else 27 <div class="center jumbotron"> 28 <div class="text-center"> 29 <h1>TABI RECO</h1> 30 {{-- ユーザ登録ページへのリンク --}} 31 {!! link_to_route('signup.get', 'Sign up now!', [], ['class' => 'btn btn-lg btn-primary']) !!} 32 </div> 33 @endif 34@endsection 35 36

ファイルをアップロードするたびにimageカラムの中の値は増えていくので、保存自体はできていると思いますが、開けようとしてみても、No file found と表示されてしまいます。

sql

1mysql> select image FROM records; 2+----------------+ 3| image | 4+----------------+ 5| /tmp/phpAVp4jJ | 6| /tmp/php1nfasl | 7| /tmp/phpJrIpvP | 8| /tmp/phppRcWnf | 9| /tmp/phpO0T069 | 10| /tmp/phpBqBIvY | 11| /tmp/phpCMsWCW | 12| /tmp/phpfRx9xx | 13| /tmp/phpzG1to4 | 14| /tmp/phpz5WiO9 | 15| /tmp/phpBMfAxU | 16+----------------+ 1711 rows in set (0.00 sec)

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

エラーメッセージなどはでておらず、文章や日付の投稿は問題なく行えます。
初学者且つ初めての質問のため、勉強不足な点も多々あると思いますが、何卒よろしくお願い致します。

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

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

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

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

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

meshi_s

2020/07/15 05:55

> storage フォルダ内にファイルが保存がされずに困っています。 > 保存自体はできていると思いますが、開けようとしてみても、No file found と表示されてしまいます。 画像自体は何処かに保存でてきるのでしょうか?保存はできているけど、表示が上手くいっていないのでしょうか? また、表示の場合、コントローラは、「RecordsController@detail」でいいのでしょうか?
Take.Y

2020/07/15 07:22

ご返信ありがとうございます。 > 画像自体は何処かに保存でてきるのでしょうか? 画像のURLは records テーブル内の image というカラムないに保存されているようなのですが、画像自体はどこにも保存されていないようです。 > コントローラは、「RecordsController@detail」でいいのでしょうか? 画像自体が保存されていない = storeAs メソッドに問題があると考えており、RecordsController@create が該当箇所だと思います。 恥ずかしながらどこの部分にエラーがあるかよく分からず、関係のないコードをたくさん載せてしまいました。分かりづらくて申し訳ありません。
meshi_s

2020/07/15 08:00

> 画像自体はどこにも保存されていないようです 「/Laravelプロジェクト/public」下にもない認識でいいでしょうか? シンボリックリンクを張ったか、「config/filesystems.php」の設定に問題がないかも確認するといいかと思います。 https://readouble.com/laravel/7.x/ja/filesystem.html
Take.Y

2020/07/15 09:07

>「/Laravelプロジェクト/public」下にもない認識でいいでしょうか? 作用でございます。 >シンボリックリンクを貼ったか 以前に一度実行したのですが、もう一度行うと「symlink(): No such file or directory」のようなエラーが出ました。 >config/filesystems.php」の設定に問題がないか filesystems の中身も以前一度確認したのですが、「ドライバの設定」や「ローカルディスク」などの部分も変更を加えるべきなのでしょうか?
meshi_s

2020/07/16 09:07

※少しそれるかもしれませんが、少し気になったので。 「$post->image = $request->image->storeAs('public/post_images', Auth::user()->id.'.jpg');」とありますが、保存先はテーブル「records」で問題ないですか? カラム「image」の値も、想定とは異なるように見えますが。 また、「$post = new Post();」も、Postをuseしてないので、エラーにならないのかなと。
Take.Y

2020/07/17 02:27

>保存先はテーブル「records」で問題ないですか? はい、作用でございます。 >カラム「image」の値も、想定とは異なるように見えますが すいません、こちらどういう意味でしょうか…? >「$post = new Post();」も、Postをuseしてないので、エラーにならないのか 申し訳ありません、post ではなく record の間違いでした。 以前参考にしたサイトを見ながら記述したので、それを書いてしまったと思われます。 大変失礼致しました。
meshi_s

2020/07/17 03:23

> カラム「image」の値も、想定とは異なるように見えますが 保存処理でファイル名は「Auth::user()->id.'.jpg'」と指定しているようですが、DBに入っている値が「/tmp/phpAVp4jJ 」などなので、気になりました。 > 申し訳ありません、post ではなく record の間違いでした。 修正しておいていただけると、他の人が見た時に混乱が少ないかと。
guest

回答1

0

enctype="multipart/form-data"
のおまじないが抜けていると思います!

投稿2020/07/21 06:25

kuwabaraakinori

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問