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

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

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

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

Q&A

1回答

1535閲覧

[Laravel]storageディレクトリに格納しているhtmlを表示したい。

toyamal

総合スコア28

Laravel

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

0グッド

0クリップ

投稿2021/07/29 00:36

前提・実現したいこと

storageディレクトリに以下の構成でファイルがあります。

storage |-app |-html ...

現在、php artisan storage:linkでシンボリッククリックの設定をしており、
storage/app/public/index.htmlの場所に格納し、以下の呼び出しでHTMLファイルを表示させることが出来ます。

<iframe src="{{asset('storage/index.html')}}"></iframe>

しかし、実際には
storage/html/index.htmlに格納し、HTMLファイルを呼び出したいです。
こちら実現するにはどのような方法がありますでしょうか。

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

storage/html/index.htmlに格納した時、HTMLファイルを呼び出すことが出来ない。

試したこと

{{asset('storage/html/index.html')}}"
では呼び出せませんでした。
storage/app/publicを見にいっていることが原因かと思います。。

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

Laravel8

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

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

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

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

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

guest

回答1

0

asset()

asset関数は、現在のリクエストのスキーマ(HTTPかHTTPS)を使い、アセットへのURLを生成します。

asset()用のディレクトリ上にものしか参照できないのだから、使い方がおかしい。

ファイルストレージ 8.x Laravel

アプリケーションのfilesystems設定ファイルに含まれているpublicディスクは、パブリックに公開してアクセスできるようにするファイルを対象としています。デフォルトでは、publicディスクはlocalドライバーを使用し、そのファイルをstorage/app/publicに保存します。

これらのファイルにWebからアクセスできるようにするには、public/storageからstorage/app/publicへのシンボリックリンクを作成する必要があります。このフォルダ規約を利用すると、Envoyerのようなダウンタイムゼロのデプロイメントシステムを使用する場合に、パブリックにアクセス可能なファイルを1つのディレクトリに保持し、デプロイメント間で簡単に共有できます。

っていう箇所を省いていたりしませんか?
asset()でアクセスできるよう、シンボリックリンクが施されているかを点検してみては。


むしろ、
ファイルのURLの節で、
Storage::url('file.jpg')みたいなファイル名を指定してのurl取得とかやってますけど、
お試しください。

投稿2021/07/29 01:53

編集2021/07/29 02:24
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

toyamal

2021/07/29 02:00

コメントありがとうございます。 filesystems.phpには以下のように記述されています。 /* |-------------------------------------------------------------------------- | Symbolic Links |-------------------------------------------------------------------------- | | Here you may configure the symbolic links that will be created when the | `storage:link` Artisan command is executed. The array keys should be | the locations of the links and the values should be their targets. | */ 'links' => [ public_path('storage') => storage_path('app/public'), ],
退会済みユーザー

退会済みユーザー

2021/07/29 02:21 編集

それと、asset()の関係は、とくにないかと。
toyamal

2021/07/29 02:38

<iframe src="{{Storage::url('html/index.html')}}"></iframe> こちら試してみたのですが、404となってしまいます。
退会済みユーザー

退会済みユーザー

2021/07/29 02:45 編集

{{Storage::url('html/index.html')}} で展開されたURLが想定とどう違うかを観察して、 同じなのだとするとstorageディレクトリがそもそも公開対象になっていない可能性も調査してください。 public_path('storage') => storage_path('app/public') からして、storage/app/public の下だけが外部公開対象になっているかと。 それを踏まえてファイルのおき場所を変えた方がかんたんです。
toyamal

2021/07/29 02:52

公開対象かどうかはどこで調べることが出来ますでしょうか?
退会済みユーザー

退会済みユーザー

2021/07/29 03:02

storage以下は基本的に非公開だと思ってる。 その中に公開対象として filesystems.php にあるような定義で一部公開対象に加えている状態ではないかと。 もしかしたら filesystems.php のlinksの定義を書き加えつつ、しっかりシンボリックリンクも実施すれば、 asset()で参照できるようになるかもしれない。 (手元ですぐ試せる環境がないので、憶測ですが。)
toyamal

2021/07/29 03:07

storage/htmlを公開対象にしたい場合はどう指定すればよろしいでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問