laravelでrouteのパラメータにスラッシュが含まれるとき

画像のアップロード処理を作っている。
画像というかファイル全般なのだが、Fileというモデルで一括管理していて、保存先は

/storage/app/uploads

になっている。ここに保存した画像をどうやって表示するか、ということなのだけど、laravel本体はドキュメントルートの上に設置されているので、直接リンクしても表示されない。

ということで、表示用のrouteを作る。
イメージとしては

/files/ファイルのパス/ファイル名

みたいなURLで呼び出すと、その画像が表示されればいいかなと。
で、いざやってみると、ファイルのパスということでパラメータにスラッシュが入っているのでうまく動かないのだ。

base64_encode しないとだめなんだそうで。

ということで、web.php を、

use Illuminate\Support\Facades\Storage;

Route::get('/files/{filePath}', function ($filePath) {
    $filePath = base64_decode($filePath);
    $path = storage_path('app/' . $filePath);

    if (!Storage::disk('local')->exists($filePath)) {
        abort(404);
    }

    return response()->file($path);
})->name('files.show');

として、ビューの方は

<img src="{{ route('files.show', ['filePath' => base64_encode($user->file->filepath . '/' . $user->file->filename)]) }}">

というようにするとよいよ。

ConoHaのワードプレスをめぐるすったもんだ

恐らく昨年の後半くらいからだと思うが、このサイトを作成しているワードプレスの動作がおかしくなった。
ブロックエディターが全く表示されなくなったのだ。新規投稿も編集も。

ということでしばらくはクラシックエディターにしてみたり、
クラシックだとプログラムコードの表示がいまいちなのでシンタックスハイライターみたいなプラグイン入れたり、
いろいろやってみてたのだけど、このソースコードを見やすくするプラグインというのも、
最近になって動作がおかしくなって、
もうほんとにいやになってワードプレスやめようかと、そういう所まできた訳である。

で、このワードプレスはConoHaの機能でボタン一つでインストールできるワードプレスなんですね。
なのでConoHaにも問い合わせてみたりしたがなんとも要領を得ない返信が返ってくるだけで。
一旦削除して入れなおしてもやっぱり投稿画面が真っ白になるわけですよ。
なんだこりゃと。

で、もうこの際ConoHaの機能を使わないで自分でインストールしてみよう、ということになり、
一つフォルダーを作ってその中に手動でインストールしてみました。
そしたら動いた訳ですよ。
ブロックエディター。
無事。
ということでテーマなど設定して復旧作業しておりました。
過去の記事は消えてしまったが、まあ、しょうがない。

一体何が原因なのかよく分からないですが、とにかくこういう自分で環境を作るのは大変ですよね。
ワードプレス、簡単なようでいて本当に大変。
やっぱりQiitaみたいなプラットフォームが安定してて楽ですよね。しみじみ実感しました。

他の人よりたくさんポイントをもらう方法を知ってますか? ゴールド会員なら!最大15%増量

phpでJSONを生成してjsに渡す時の注意点

jsonを生成する時に単純に

$json = json_encode($str);

としていないだろうか。単なる数値だけならこれでよいが、例えば、

$str[1] = "G'men '75";
$str[2] = '\2,800';
$str[3] = 'my name is "john"';

というような文字列をエンコードしてjavascriptに渡すとエラーになる。

$json = json_encode($str, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS );
$json = str_replace('\\', '\\\\', $json);

とするのがよい。

Hello world!

Welcome to WordPress. This is your first post. Edit or delete it, then start writing!