Laravel - 通过控制器将 GET 请求传递给文件
Laravel - pass GET requests to files through controller
在我的 laravel 应用程序中,我想在重定向 he/she 到实际文件之前验证客户端是否有 cookie。为此,我创建了一个控制器函数来接收我创建的这条新路线:
Route::group(['middleware'=>['web']], function(){
Route::get('/storage/{filename}', 'HomeController@getArquivo');
}
控制器:
class HomeController extends Controller{
public function getArquivo($filename)
{
if(hasCookie()) Redirect::to('/storage/' . $filename);
else Redirect::to('/some/other/address');
}
}
因此,例如,在我的存储中,我有一个名为 8-0.jpeg
的文件,只有当我传递一个与其不同的文件名(如 url 时,才会调用 getArquivo
函数。 com/storage/something)。如果我传递确切的文件名 url.com/storage/8-0.jpeg) 那么它只是 returns 忽略路由的图像。所以我的问题是,如何强制 GET 请求始终首先通过此控制器?提前致谢。
编辑: 我已经根据提供的答案进行了更改,但我无法让它工作。现在代码如何:
中间件:
class VerificaCookieArquivo
{
var $nomeBiscoitoSessao = "biscoito";
public function handle($request, Closure $next)
{
if ($this->temBiscoito()) {
return $next($request);
}
return Redirect::to('/some/other/address');
}
private function temBiscoito(){
return isset($_COOKIE[$this->nomeBiscoitoSessao]);
}
}
Kernel.php
:
protected $routeMiddleware = [
//other middlewares
'verificaCookieArquivo' => \Ibbr\Http\Middleware\VerificaCookieArquivo::class,
];
在路由 (web.php
) 中,我为这个 cookie 检查创建了一个单独的路由组,因为我不希望它影响我拥有的其他路由:
Route::group(['middleware'=>['verificaCookieArquivo']], function()
{
Route::get('/storage/{filename}', 'HomeController@getArquivo');
});
在HomeController.php中:
public function getArquivo($filename){
$fullpath = "/storage/" . $filename;
return response()->download(storage_path($fullpath), null, [], null);
}
仍然无法正常工作,行为仍然和以前一样
在 LAravel 中创建一个中间件:
php artisan make:middleware CookieCheck
将此中间件添加到 Kernel.php
文件
将这些中间件添加到路由:
Route::group(['middleware'=>['web','cookie:check']], function(){
Route::get('/storage/{filename}', 'HomeController@getArquivo');
}
将Cookie校验码放入中间件。
创建一个中间件,用于检查具有有效 cookie 的访问者。你可以这样创建它
中间件class
namespace App\Http\Middleware;
use Closure;
class SecureFile
{
public function handle($request, Closure $next)
{
if ($this->hasCookie()) {
return $next($request);
}
return redirect('/some/other/address');
}
private function hasCookie(){
//check cookie here and return ture or false
return true;
}
}
现在将此 SecureFile
中间件添加到 Kernel.php 中的 routeMiddleware
protected $routeMiddleware = [
...
...
'secureFile' => \App\Http\Middleware\SecureFile::class,
];
最后一步将此中间件用于您的路由
Route::group(['middleware'=>['web','secureFile']], function(){
Route::get('/storage/{filename}', 'HomeController@getArquivo');
}
并在控制器中
class HomeController extends Controller{
public function getArquivo($filename)
{
$fullpath = "any_sub_folder/" . $filename;
return response()->download(storage_path($fullpath), null, [], null);
//https://laravel.com/docs/5.6/responses#file-downloads
}
}
编辑
看起来你在 public/storage
文件夹中有图像然后你的图像将被直接加载,它不会调用你的路线。尝试将您的图片放在 storage
文件夹中,然后像这样添加不同的路线
Route::get('file/{filename}', 'HomeController@getArquivo')->middleware('secureFile');
在我的 laravel 应用程序中,我想在重定向 he/she 到实际文件之前验证客户端是否有 cookie。为此,我创建了一个控制器函数来接收我创建的这条新路线:
Route::group(['middleware'=>['web']], function(){
Route::get('/storage/{filename}', 'HomeController@getArquivo');
}
控制器:
class HomeController extends Controller{
public function getArquivo($filename)
{
if(hasCookie()) Redirect::to('/storage/' . $filename);
else Redirect::to('/some/other/address');
}
}
因此,例如,在我的存储中,我有一个名为 8-0.jpeg
的文件,只有当我传递一个与其不同的文件名(如 url 时,才会调用 getArquivo
函数。 com/storage/something)。如果我传递确切的文件名 url.com/storage/8-0.jpeg) 那么它只是 returns 忽略路由的图像。所以我的问题是,如何强制 GET 请求始终首先通过此控制器?提前致谢。
编辑: 我已经根据提供的答案进行了更改,但我无法让它工作。现在代码如何:
中间件:
class VerificaCookieArquivo
{
var $nomeBiscoitoSessao = "biscoito";
public function handle($request, Closure $next)
{
if ($this->temBiscoito()) {
return $next($request);
}
return Redirect::to('/some/other/address');
}
private function temBiscoito(){
return isset($_COOKIE[$this->nomeBiscoitoSessao]);
}
}
Kernel.php
:
protected $routeMiddleware = [
//other middlewares
'verificaCookieArquivo' => \Ibbr\Http\Middleware\VerificaCookieArquivo::class,
];
在路由 (web.php
) 中,我为这个 cookie 检查创建了一个单独的路由组,因为我不希望它影响我拥有的其他路由:
Route::group(['middleware'=>['verificaCookieArquivo']], function()
{
Route::get('/storage/{filename}', 'HomeController@getArquivo');
});
在HomeController.php中:
public function getArquivo($filename){
$fullpath = "/storage/" . $filename;
return response()->download(storage_path($fullpath), null, [], null);
}
仍然无法正常工作,行为仍然和以前一样
在 LAravel 中创建一个中间件:
php artisan make:middleware CookieCheck
将此中间件添加到 Kernel.php
文件
将这些中间件添加到路由:
Route::group(['middleware'=>['web','cookie:check']], function(){
Route::get('/storage/{filename}', 'HomeController@getArquivo');
}
将Cookie校验码放入中间件。
创建一个中间件,用于检查具有有效 cookie 的访问者。你可以这样创建它
中间件class
namespace App\Http\Middleware;
use Closure;
class SecureFile
{
public function handle($request, Closure $next)
{
if ($this->hasCookie()) {
return $next($request);
}
return redirect('/some/other/address');
}
private function hasCookie(){
//check cookie here and return ture or false
return true;
}
}
现在将此 SecureFile
中间件添加到 Kernel.php 中的 routeMiddleware
protected $routeMiddleware = [
...
...
'secureFile' => \App\Http\Middleware\SecureFile::class,
];
最后一步将此中间件用于您的路由
Route::group(['middleware'=>['web','secureFile']], function(){
Route::get('/storage/{filename}', 'HomeController@getArquivo');
}
并在控制器中
class HomeController extends Controller{
public function getArquivo($filename)
{
$fullpath = "any_sub_folder/" . $filename;
return response()->download(storage_path($fullpath), null, [], null);
//https://laravel.com/docs/5.6/responses#file-downloads
}
}
编辑
看起来你在 public/storage
文件夹中有图像然后你的图像将被直接加载,它不会调用你的路线。尝试将您的图片放在 storage
文件夹中,然后像这样添加不同的路线
Route::get('file/{filename}', 'HomeController@getArquivo')->middleware('secureFile');