web-dev-qa-db-ja.com

BinaryFileResponse in Laravel undefined

次の問題が発生しました。ルート/ getImage/{id}に画像を返したいのですが、関数は次のようになります。

public function getImage($id){
   $image = Image::find($id);
   return response()->download('/srv/www/example.com/api/public/images/'.$image->filename);
}

私がこれをするとき、それは私にこれを返します:

FatalErrorException in HandleCors.php line 18:
Call to undefined method Symfony\Component\HttpFoundation\BinaryFileResponse::header()

use Response;コントローラーの先頭。 HandleCors.phpが問題だとは思わないが、とにかく:

<?php namespace App\Http\Middleware;
use Closure;

use Illuminate\Contracts\Routing\Middleware;
use Illuminate\Http\Response;

class CORS implements Middleware {

public function handle($request, Closure $next)
{
      return $next($request)->header('Access-Control-Allow-Origin' , '*')
            ->header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS, PUT, DELETE')
            ->header('Access-Control-Allow-Headers', 'Content-Type, Accept, Authorization, X-Requested-With, Application');
     }
}

Laravelドキュメントに記載されているとおりなので、これがなぜ起こるのか実際にはわかりません。エラーが発生したときにLaravelを更新しましたが、これは修正しないでください。

25
Sebi55

問題は、その関数を持たないResponseオブジェクト(_Symfony\Component\HttpFoundation\BinaryFileResponse_クラス)で->header()を呼び出していることです。 ->header()関数は 特性の一部 であり、Laravelの 応答クラス によって使用され、基本のsymfony応答ではありません。

幸い、headersプロパティにアクセスできるので、次のようにできます。

_$response = $next($request);

$response->headers->set('Access-Control-Allow-Origin' , '*');
$response->headers->set('Access-Control-Allow-Methods', 'POST, GET, OPTIONS, PUT, DELETE');
$response->headers->set('Access-Control-Allow-Headers', 'Content-Type, Accept, Authorization, X-Requested-With, Application');

return $response;
_
50
treeface

リクエストの提出に応答する場合、これらのタイプのリクエストにはヘッダーを設定せず、他のすべてのネイティブレスポンスタイプにヘッダーを設定することができます。

これは、返されたheaderclosureメソッドが存在することを確認することで実行できます。

現在のクロージャーインスタンスでheaderメソッドを使用できない場合は、別の方法をとることができます。


public function handle($request, Closure $next)
{
    $handle = $next($request);

    if(method_exists($handle, 'header'))
    {
        $handle->header('Access-Control-Allow-Origin' , '*')
               ->header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS, PUT, DELETE')
               ->header('Access-Control-Allow-Headers', 'Content-Type, Accept, Authorization, X-Requested-With, Application');
    }

    return $handle;

}
2
Marc Newton