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

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

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

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

Q&A

解決済

2回答

7838閲覧

【Laravel-admin】ユーザー側で投稿した画像が、管理画面で表示されない。

6stThe

総合スコア7

Laravel

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

0グッド

0クリップ

投稿2020/03/29 13:11

環境

PHP 7.4.2
Laravel 6.16.0
composer 1.9.2
macOS Catalina 10.15.3

解決したいこと

ユーザー側で投稿した画像を、Laravel-adminで作った管理画面でも表示できるようにしたいです。

状況

laravelで掲示板を作っています。画像の表示で数日詰まっています。

・ユーザー側での投稿は、タイトル、本文、投稿日時などは、管理画面でも表示される。
・管理画面で投稿した画像は、ユーザー側でも表示される。
・シンボリックリンクは張っている。
・ユーザー側と管理側で、投稿した画像は同じフォルダに保存されている。('storage/app/public'内)
・画像を添付したユーザー側での投稿を、管理画面でデベロッパーツールで確認すると、img src="/storage//storage/..."となっていて、冒頭をimg src="/storage/..."に修正すると、管理画面でも画像が表示されるようになる。
・デベロッパーツール上でのみ、404 Not Foundのエラー文が表示される。

最後に書いたものから、img src="/storage/..."がデフォルトになるように設定すればいいかと思うのですが、admin.phpのdiskや、filesystems.phpのrootやurlをいじったり、Controllerの$path周辺をいじったりしましたが解消されず、困っています。
以下、関連のありそうなコードと、参考にしたサイトを記載します。
何かヒントやアドバイスをいただけると有り難いです。よろしくお願いします。

コード

PostController

1public function store(PostRequest $request) 2 { 3 4 $image = $request->file('files'); 5 6 if($request->hasFile('files') && $image->isValid()){ 7 $file_name = $image->getClientOriginalName(); 8 $path = $image->storeAs('public', $file_name, ['disk' => 'local']); 9 $path = Storage::url($path); 10 }else{ 11 $path = null; 12 } 13 14 $post = new Post; 15 $post->user_id = $request->user_id; 16 $post->title = $request->title; 17 $post->content = $request->content; 18 $post->image = $path; 19 20 $post->save(); 21 22 return redirect()->route('posts.index')->with('status', '新しく投稿しました。'); 23 }

AdminPostController

1protected function grid() 2 { 3 $grid = new Grid(new Post()); 4 5 $grid->column('id', __('Id')); 6 $grid->column('user_id', __('User id'))->sortable(); 7 $grid->column('title', __('Title')); 8 $grid->column('content', __('Content')); 9 $grid->column('image', __('Image'))->image(); 10 $grid->column('created_at', __('Created at'))->sortable(); 11 $grid->column('updated_at', __('Updated at')); 12 13 return $grid; 14 } 15 16 /** 17 * Make a show builder. 18 * 19 * @param mixed $id 20 * @return Show 21 */ 22 protected function detail($id) 23 { 24 $show = new Show(Post::findOrFail($id)); 25 26 $show->field('id', __('Id')); 27 $show->field('user_id', __('User id')); 28 $show->field('title', __('Title')); 29 $show->field('content', __('Content')); 30 $show->field('image', __('Image'))->image(); 31 $show->field('created_at', __('Created at')); 32 $show->field('updated_at', __('Updated at')); 33 dd($show); 34 35 return $show; 36 }
routes.php Route::get('public/{filename}', function ($filename) { $path = storage_path() . '/app/public/' . $filename; if(!File::exists($path)) abort(404); $file = File::get($path); $type = File::mimeType($path); $response = Response::make($file, 200); $response->header("Content-Type", $type); return $response; });
admin.php 'upload' => [ // Disk in `config/filesystem.php`. 'disk' => 'local', // Image and file upload path under the disk above. 'directory' => [ 'image' => 'public', 'file' => 'files', ], ],
filesystems.php 'disks' => [ 'local' => [ 'driver' => 'local', 'root' => storage_path('app'), ], 'public' => [ 'driver' => 'local', 'root' => storage_path('app'), 'url' => env('APP_URL').'/storage', 'visibility' => 'public', ], 's3' => [ 'driver' => 's3', 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'region' => env('AWS_DEFAULT_REGION'), 'bucket' => env('AWS_BUCKET'), 'url' => env('AWS_URL'), ], 'admin' => [ 'driver' => 'local', 'root' => storage_path('app'), 'visibility' => 'public', 'url' => env('APP_URL').'/storage', ], ],

参考にしたサイト

・Laravel 公式リファレンス
https://readouble.com/laravel/5.6/ja/filesystem.html

・Laravel-admin リファレンス
https://laravel-admin.org/docs/#/

・laravel-adminで管理画面を速攻で構築する。https://qiita.com/pikonori/items/a04066010e7380b3ee38#%E4%BD%9C%E6%88%90%E3%81%95%E3%82%8C%E3%81%9F%E3%83%9A%E3%83%BC%E3%82%B8

・Laravel 5.7 laravel-admin CRUDを導入しよう
https://tac-blog.tech/index.php/2018/09/29/laravel-admin-add-crud/
↑こちらのブログのLaravel-admin関連の記事全般。

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

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

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

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

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

guest

回答2

0

ベストアンサー

Webからのアクセスを許すには、public/storageからstorage/app/publicへシンボリックリンクを張り、asset('storage/ファイル名');
ファイルへのURLを生成できます
と公式にありましたがこれですとどうでしょうか?

assetでpublic内が指定され、storageの中はstorage/app/publicにシンボリックリンクが張られているので
$path = asset("storage/${filename}");
こんな感じですかね

試していただけると幸いです

投稿2020/03/30 05:12

natsume2233

総合スコア225

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

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

6stThe

2020/03/30 13:35

コメントありがとうございます! PostControllerの$pathを、上記の通り修正して投稿したところ、管理画面でも画像が表示されました! `asset`は、bladeファイルの中で`<img src="{{ asset($post->image) }}"...>`みたいな使い方をしたことはあったのですが、こういう風にも使えるんですね。 勉強になりました。本当にありがとうございます!
guest

0

URLの指定方法が悪いからでは?

投稿2020/03/29 18:20

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

6stThe

2020/03/30 13:23

コメントありがとうございます! おそらくそうだと思います。 上のnatsume2233さんのコメントが解決の糸口になりそうなので、もう少し粘ってみます。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問