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

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

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

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

1149閲覧

laravel5.7 storage配下に作成したhtmlをブラウザでプレビューしたい

whawhawha

総合スコア8

PHP

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2019/02/06 13:24

やりたいこと

laravelでhtmlファイルを作成、編集できるcms的なものを作成しており、

xxxx/storage/app/files/html/index.html

上のような形でstorageにディレクトリを作成し、作成したhtmlを保存していくような形にしたのですが、
このhtmlのプレビューをブラウザで表示したいです。

知りたいこと

下記実装で、表示はできたのですが、
htmlと同じくstorage/files配下に保存しているcss, js, 画像などの外部ファイルが
当然ですが読み込めません。(パス等はpreview用に書き換える処理を挟んでいます。)

controller

1public function __construct(){ 2 $this->middleware('auth'); 3} 4 5public function preview(){ 6 $path = storage_path("app/files/html/index.html"); 7 if($file_exists($path) && is_file($path)){ 8 return response()->file($path); 9 }else{ 10 return view("404"); 11 } 12}

そこでpublicに一時的に下記のようなpreview用のディレクトリを用意して、そのパスをコントローラーに渡し、プレビュー用のウィンドウを閉じたら一時ディレクトリごと削除するような形で考えたのですが、

storage/app/publicに置くと、閲覧権限がなくてもパスがわかれば閲覧できてしまうため、
できれば一時的であってもpublicに置きたくありません。

publicに置かなくてもcss等を外部ファイルとして読み込み、正確なプレビューを表示できる方法があれば知りたいです。

storage/app ├── public     ├── preview ├── index.html ├── css │ ├── style.css │ ├── img │ ├── item.jpg │ ├── js

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

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

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

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

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

guest

回答1

0

ベストアンサー

htmlファイルに限らず、全てのファイルをpreview()経由で表示すれば良いかと思いますが、どうでしょうか。


例えば。

CMSで作成されたファイルが、下記のように保存されているとして

xxxx/storage/app/files/html/index.html xxxx/storage/app/files/html/css/style.css xxxx/storage/app/files/html/img/item.jpg xxxx/storage/app/files/html/js/xxxxx.js

http://ドメイン/preview/ 以下のURLのパスがディレクトリ名で終わる場合は、
該当ディレクトリ直下のindex.htmlを表示したいものとします。

ルート設定はこんな感じ。

php

1Route::get('preview/{preview_path?}', 'XXController::preview')->where('preview_path', '.*');

URLに含まれるスラッシュもパラメータとして受け取れるように、条件指定が必要です。

コントローラーのpreview()はこんな感じですね。

php

1public function preview($preview_path = ''){ 2 $path = storage_path("app/files/html/".$preview_path); 3 if(file_exists($path)){ 4 //ディレクトリなら、「index.html」を付ける 5 if(is_dir($path)){ 6 $path .= '/index.html'; 7 } 8 //存在しないか、ファイルじゃなければ、パスを空に 9 if(!file_exists($path) || !is_file($path)){ 10 $path = ''; 11 } 12 }else{ 13 //存在しない場合は、パスを空に 14 $path = '';//空に 15 } 16 17 //return をいくつも書くのが、個人的に好きではないので、まとめちゃいます・・・ 18 //パスが空じゃなければ、ファイルレスポンスを返却。それ以外は404 19 return $path != '' ? response()->file($path) : abort(404); 20}

これで、アクセスしたURLによって、preview_pathの中身が下記のようになります。

text

1http://ドメイン/preview/ → $preview_path = '' 2http://ドメイン/preview/index.html → $preview_path = 'index.html' 3http://ドメイン/preview/css/style.css → $preview_path = 'css/style.css'

※ 余談になりますが、
最後の404の返却は、return view("404")で返却すると、ステータスが404ではなく200(正常なページ)になってしまうので、abort(404)に変更しています。
ただ、preview()は認証付のページなので「200でnot found」でも仕様的に問題なければ、return view("404")のままでも問題と思います。


なお、

パス等はpreview用に書き換える処理を挟んでいます。

は、ファイルがhtmlの場合に、この処理が行われるように調整するのが良いと思います。

投稿2019/02/07 03:45

mix-peach

総合スコア1910

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

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

mix-peach

2019/02/07 03:46

すみません。書き忘れましたが、コードは未検証なので、スペルミスなど不具合がありましたら、ご容赦くださいね^^;
whawhawha

2019/02/07 14:14

回答ありがとうございます! routeのみ XXController::preview → XXController@previewに変更して、 css等を読み込んだ状態でHTMLをプレビューすることができました。 まだ問題は残っており、cssがResource interpreted as Stylesheet but transferred with MIME type text/plainもしくはMIME type text/x-c++となり、読み込めているのに適用されない、一部のプロパティが適用されないかと思いきやコントローラーにdump()を入れると、 Resource interpreted as Stylesheet but transferred with MIME type text/plainとなっているcssが適用される珍妙な状態になっていますが、なんとか前に進めそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問