パブリック フォルダーをユーザーの混乱から守りたいため、ユーザー プロファイルの写真をパブリック フォルダーではなく 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