Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel-通过控制器将GET请求传递给文件_Php_Laravel_Http Get_Laravel 5.6 - Fatal编程技术网

Php Laravel-通过控制器将GET请求传递给文件

Php Laravel-通过控制器将GET请求传递给文件,php,laravel,http-get,laravel-5.6,Php,Laravel,Http Get,Laravel 5.6,在我的laravel应用程序中,我想在将客户端重定向到实际文件之前验证客户端是否有cookie。为此,我创建了一个控制器函数来接收我创建的新路由: Route::group(['middleware'=>['web']], function(){ Route::get('/storage/{filename}', 'HomeController@getArquivo'); } 控制器: class HomeController extends Controller{ publi

在我的laravel应用程序中,我想在将客户端重定向到实际文件之前验证客户端是否有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.com/storage/something)时才会调用
getArquivo
函数。如果我传递了确切的文件名url.com/storage/8-0.jpeg),那么它只会返回忽略路由的图像。所以我的问题是,如何强制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,
];
在routes(
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的访问者。您可以这样创建它

Route::get('file/{filename}', 'HomeController@getArquivo')->middleware('secureFile');
中间件类

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
     }
}
编辑 似乎您在
公共/存储
文件夹中有图像,然后您的图像将直接加载,它不会调用您的路径。尝试将图像放置在
存储
文件夹中,然后像这样添加不同的路径

Route::get('file/{filename}', 'HomeController@getArquivo')->middleware('secureFile');

这不起作用,我还必须将
route::get
放到另一个中间件组中,该中间件组位于
web
中,因为它与我不想验证此cookie的其他路由相混淆。创建一个需要检查cookie的单独路由组。如果这是唯一的然后为其创建单独的路由,直到无法使其工作,我已经用我编写的新代码更新了我的问题您在公用文件夹中有存储文件夹吗?如果您在公用文件夹中有存储文件夹,并且所有图像都在其中,则所有这些图像都是可公用访问的。保护那些您对
storage
文件夹、
storage\u path
return
laravel\u root\u文件夹/storage
not
public/storage
文件夹感到困惑的图像是没有用的。公用文件夹中的任何文件都是公开可用的。最好将您的私人图像(需要cookie)存储在
laravel\u root\u文件夹/storage
文件夹中,然后尝试我的答案它会起作用的