Laravel 5.x フォルダー内のパブリック ビューからイメージを保護することができます。
Laravel のように、images
フォルダーの下にフォルダーを作成しstorage
ます (フォルダーに画像をアップロードするときに使用できる書き込み権限が既にあるため、フォルダーを選択storage
storage/app/images
しました) 。
保護したい画像をパブリックフォルダーから新しく作成したimages
フォルダーに移動します。フォルダーを作成するために他の場所を選択することもできimages
ますが、パブリックフォルダー内ではなく、Laravel フォルダー構造ではありますが、論理的な場所の例はコントローラーフォルダー内ではありません。次に、ルートとイメージ コントローラーを作成する必要があります。
ルートを作成
Route::get('images/users/{user_id}/{slug}', [
'as' => 'images.show',
'uses' => 'ImagesController@show',
'middleware' => 'auth',
]);
人がログインしていない場合、ルートはすべてのイメージ要求アクセスを認証ページに転送します。
ImagesController の作成
class ImagesController extends Controller {
public function show($user_id, $slug)
{
$storagePath = storage_path('app/images/users/' . $user_id . '/' . $slug);
return Image::make($storagePath)->response();
}
}
編集(注)
Laravel 5.2以降をお使いの方向け。Laravel は、オーバーヘッドの少ないファイルを提供する新しいより良い方法を導入しています (この方法では、回答に記載されているようにファイルが再生成されません)。
ファイル応答
file メソッドを使用すると、ダウンロードを開始する代わりに、画像や PDF などのファイルをユーザーのブラウザに直接表示できます。このメソッドは、ファイルへのパスを最初の引数として受け取り、ヘッダーの配列を 2 番目の引数として受け取ります。
return response()->file($pathToFile);
return response()->file($pathToFile, $headers);
要件に合わせて、ストレージ パスとファイル/フォルダー構造を変更できます。
コントローラー内の特定のメンバーの画像のみを表示する条件を追加することもできます。
さらに、ファイル名、タイムスタンプ、その他の変数を使用してファイル名をハッシュすることもできます。
追加:この方法をパブリック フォルダーのアップロードの代わりに使用できるかどうかを尋ねる人もいました。はい、可能ですが、この回答で説明されているように、推奨される方法ではありません。したがって、同じ方法を使用して、画像を保護するつもりがない場合でも、ストレージ パスに画像をアップロードすることができます。同じプロセスに従って を削除して'middleware' => 'auth',
ください。そうすれば、パブリック フォルダーに 777 のアクセス許可を与えなくても、安全なアップロード環境を維持できます。同じ言及された答えは、誰かがそれを使用したり、代替ソリューションを提供したりする場合に備えて、認証なしでこの方法を使用する方法も説明しています。