【Laravel】画像ファイルをレスポンスするには?

laravel Laravel

単純に画像ファイルをブラウザにレスポンスする方法を紹介します。

認証されているかチェックしてから、画像を返したいときなどに使える手法です。

シンボリックリンクを作成すると、保存されているファイルがすべて公開されてしまいますが、今回紹介する方法を使用すると、例えば認証されているかチェックしてからファイルを返したりすることができるようになります。

スポンサーリンク

ソースコード

たとえば、storage/app/uploads/sample.jpgをレスポンスしたいときは、次のようになります。

use Illuminate\Support\Facades\Storage;

return response()->file(Storage::path("uploads/sample.jpg"));

ブラウザでアクセスすると、画像が表示されます。

スポンサーリンク

解説

Storage::path()により、storageディレクトリまでのフルパスを取得しています。

>>> Storage::path();
C:\\Users\user\Documents\projects\laravel\storage\

引数にstorage以下の相対ファイルパスを指定すると、ファイルのフルパスを取得することができます。

>>> Storage::path("app");
C:\\Users\user\Documents\projects\laravel\storage\app\
>>> Storage::path("app/sample.png");
C:\\Users\user\Documents\projects\laravel\storage\app\sample.png

ファイルをレスポンスするには、response()->fileを使用します。

return response()->file(<ファイルのフルパス>));

ファイルが存在しないとき404を返すには?

abort_unlessを使用します。

abort_unless(Storage::exists($filepath), 404);

ファイルが存在しない場合は404 Not Foundが返され、処理が中止されます。なお、$filepathにはstorage以下の相対パスを指定します。

もしフルパスでファイルを指定したい場合は、代わりにFile::exists()を使用してください。

use Illuminate\Support\Facades\File;

abort_unless(File::exists($filepath), 404);

コメント

タイトルとURLをコピーしました