前提・実現したいこと
Laravel6にて音楽系のWebアプリを作成しています。
今回Herokuにてデプロイした後,挿入していた画像が表示がされなくなり,それに対応するためにControllerとViewを少しいじったのですが,その後当該viewにて500 server errorが起きてしまいました。いじった内容は下記に記載しております。
発生している問題・エラーメッセージ
500 Server Error
GET https://calm-sea-47307.herokuapp.com/artists/1/1 500 (Internal Server Error) ```こちらはGoogleのデベロッパーツールにて取得したエラーです ### 該当のソースコード ```ここに言語名を入力 /g-chord/app/Http/Controllers/LyricController.php <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Lyric; use App\SongTitle; use App\Post; class LyricController extends Controller { public function show($artist_id, $song_title_id) { $lyric = SongTitle::find($song_title_id)->lyrics; $image = base64_encode(file_get_contents($lyric->image)); $posts = Post::all(); return view('Lyric.show')->with(['lyric' => $lyric, 'image' => $image, 'posts' => $posts, 'artist_id' => $artist_id, 'song_title_id' => $song_title_id]); } } ```このコントローラーでいじったのは$image~の部分と,return内にimageを追加したことです。herokuではローカルで出来ていた画像表示ができず,僕はこのバイナリーデータにする方法で試みました。結果としてはローカル内では画像が確認できたのですが,本番環境ではエラーになってしまいました。
/g-chord/resources/views/Lyric/show.blade.php
@extends('layouts.app')
@section('content')
<h1>{{ $lyric->name }}</h1>
<div class="lyric">
<img src="data:image/png;base64,{{ $image }}">
</div>
<h1>コメント</h1> <div class='posts'> @foreach ($posts as $post) <div class='post'> <h2 class='title'>{{ $post->name }}</h2> <p class='body'>{{ $post->content }}</p> <form style="display: inline-block;" method="POST" action="/artists/{{ $artist_id }}/{{ $song_title_id }}/{{ $post->id }}"> @csrf @method('DELETE') <button class="btn btn-danger">削除する</button> </form> </div> @endforeach <form action="/artists/{{ $artist_id }}/{{ $song_title_id }}" method="POST"> @csrf <div class="name"> <h2>ユーザーネーム</h2> <input type="text" name="post[name]" placeholder="タイトル"/> </div> <div class="content"> <h2>内容</h2> <textarea name="post[content]" placeholder="コメント"></textarea> </div> <input type="submit" value="保存"/> </form> </div>
@endsection
### 試したこと Herokuでのmigrateのし直しや,pushも行いました。 ### 補足情報(FW/ツールのバージョンなど) 他に追加した方が良い情報等ありましたらなんなりとお申し付けください。 追記(2021/8/24現在): Laravelのデバッグ機能を使ってみたところ,次のようなエラーが確認できました。 ```ここに言語を入力 file_get_contents(storage/song/タイトル未定.png): failed to open stream: No such file or directory ```ここまでくると自分でもなんとなく予想はつき,パスを書き換える必要があるようなのですが,ローカルでは動いたのに本番では動かない理由だけがイマイチよく分かっておりません。 追記2(2021/8/28現在)回答者様からheroku環境でのシンボリックリンクについて言及がありました。そこでそのことを調べたのですが,[Laravel×Heroku】シンボリックリンクが上手くいかない時の対処法](https://qiita.com/tokiya_takai/items/5afab752c5826e4dcc62)という記事を見つけました。そこではローカル環境とheroku環境でのパスの違いが閲覧できない理由を生んでいると書かれていました。そこでその記事の通り,heroku環境に合わせてローカルのシンボリックリンクを変更しました。しかし今度はローカル環境で動かなくなってしまいました。当該記事でも再設定が必要であると書かれていたのですが,どのように再設定を行うかが調べても判りませんでした。 ```ここに言語を入力 1 ec2-user ec2-user 23 Aug 28 15:03 storage -> /app/storage/app/public
ここでは反映されていないのですが,storageが赤字になっております。
画像はシンボリックリンクの場所になっております。変更前はフォルダーだったのですが,変更後はファイルになってしまっているようです。