Laravelで画像を提供するにはどうすればいいですか? 質問する

Laravelで画像を提供するにはどうすればいいですか? 質問する

パブリック フォルダーをユーザーの混乱から守りたいため、ユーザー プロファイルの写真をパブリック フォルダーではなく Laravel ストレージ フォルダーに保存しています。

そのフォルダーから画像を提供するために、次のような簡単なコントローラー アクションを作成しました。

public function profilePicture($person, $size = 40){
    $profile_picture_url = storage_path().'/profile_pictures/'.$person['id'].'/profile_'.$size.'.jpg';

    if(!File::exists( $profile_picture_url ))
        App::abort(404);

    return Image::make($profile_picture_url)->response('jpg');
}

これは良い方法と言えるでしょうか、それとも単に写真をパブリック フォルダーに保存するべきでしょうか?

そうすることでパフォーマンスの問題が発生しますか?

ベストアンサー1

あなたの質問に対する短い答え

これは良い方法と言えるでしょうか、それとも単にパブリック フォルダーに写真を保存するべきでしょうか。そうすることでパフォーマンスの問題が発生するでしょうか。

これは推奨される方法ではありません。ファイルを読み込んで再生成するため、処理に時間がかかり、サーバーに負荷がかかりますが、リクエストの数や画像のサイズなどによって異なります。私はこの方法を使用して、画像/ファイルをパブリックアクセスから保護しました。そのため、この画像/ファイルには、認証されたメンバーだけがアクセスできます。答え. ファイル サイズ、リクエスト数、サーバーの仕様にもよりますが、しばらく使用していますが、パフォーマンスに問題はなく、問題なく動作しています (私のサーバーは 512MB のメモリ、1 コア プロセッサ、20GBSSD ディスクの VPS ソリューションです)。しばらく試してみて、確認してみてはいかがでしょうか。

シンボリックリンクソリューション

次のようなシンボリックリンクを作成することもできます。

ln -s /pathof/laravel/storage/profile_pictures /pathof/laravel/public/profile

この解決策はパフォーマンスには影響しませんが、セットアップを新しいプロバイダーに移動する場合や、ストレージ フォルダーに再リンクする必要がある場合に備えて、解決策を社内ドキュメントに文書化する必要があります。

しかし、ストレージ フォルダーからイメージを返すための完全なソリューションが必要な場合は、まず、Laravel 用の Intervention Image をインストールする必要があります。これが既に行われているかどうかはわかりません。インストールしている場合はここで続行しますが、インストールされていない場合は、この回答の最後の部分に従って、Laravel ソリューションを続行してください。

Laravelソリューション

前述のとおり、介入が機能すると想定しているため、まずルートを作成する必要があります。ルートは、すべてのイメージ要求アクセスをコントローラーに転送します。

ルートを作成

Route::get('profile/{person}', 'ImagesController@profilePicture');

ルートを作成したら、ルートからの画像リクエストを処理するコントローラーを作成する必要があります。

ImagesControllerを作成する

コマンドから

php artisan make:controller ImagesController

コントローラーは次のようになります。

class ImagesController extends Controller {

    public function profilePicture($person, $size = 40)
    {
        $storagePath = storage_path('/profile_pictures/' . $person . '/profile_' . $size . '.jpg');

        return Image::make($storagePath)->response();
    }
}

**編集**

Laravel 5.2以降をお使いの方向け。Laravelは、新しい、より良い方法を導入しています。ファイルを提供するオーバーヘッドが少なくなります(この方法では、回答に記載されているようにファイルが再生成されません)。

ファイルレスポンス

ファイル メソッドを使用すると、ダウンロードを開始する代わりに、画像や PDF などのファイルをユーザーのブラウザーに直接表示できます。このメソッドは、ファイルへのパスを最初の引数として受け取り、ヘッダーの配列を 2 番目の引数として受け取ります。

return response()->file($pathToFile);

return response()->file($pathToFile, $headers);

そして忘れずに付け加えてください

use Intervention\Image\Facades\Image;

ImagesControllerあなたのクラスで

最後に、テスト イメージを含むフォルダー構造を作成したことを確認します。

storage/profile_pictures/person/profile_40.jpg

ブラウザで入力すると

http://laravelLocalhostUrl/profile/person

あなたのイメージが表示されます。私はそれを自分で作成し、テストしました。ブラウザウィンドウに表示されるローカルホストから提供された画像のスクリーンショット

注: フォルダーがあなたの質問を反映するように最善を尽くしましたが、必要に応じて簡単に変更できます。


インストール介入(すでにインストールされている場合はこの部分をスキップしてください)

次のガイドラインに従ってください:http://image.intervention.io/getting_started/インストール

簡単に言うと:php composer require intervention/image

config/app$providers 配列には、このパッケージのサービス プロバイダーが追加されます。

Intervention\Image\ImageServiceProvider::class

このパッケージのファサードを $aliases 配列に追加します。

'Image' => Intervention\Image\Facades\Image::class

このことからヒントを得た解決策答え一般的には認証で画像を保護することであり、これは答え

おすすめ記事