laravel - Cors 中间件在使用 Header() 时导致响应错误

and*_*ini 2 php laravel

我正在使用 Laravel 5.6 和这个中间件来允许 Ionic 应用程序调用我的 API

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

class Cors
{
    public function handle($request, Closure $next)
    {
        return $next($request)
            ->header('Access-Control-Allow-Origin', '*')
            ->header('Access-Control-Allow-Methods', 'GET, POST, PUT, PATCH, DELETE, OPTIONS')
            ->header('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-Requested-With, X-XSRF-TOKEN');
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,这会导致我强制下载文件的两个请求出现错误。

Call to undefined method Symfony\Component\HttpFoundation\BinaryFileResponse::header()
Run Code Online (Sandbox Code Playgroud)

我的要求1

return Excel::download(new \App\Exports\FleetExport($fleetId), 'debts.xlsx');
Run Code Online (Sandbox Code Playgroud)

我的要求2

return \Response::download($file_path,
                           $file_name,
                           array('Content-Type: application/octet-stream','Content-Length: '. filesize($file_path))
                           )->deleteFileAfterSend(true);
Run Code Online (Sandbox Code Playgroud)

禁用这个中间件可以使我的请求正常工作。

难道我做错了什么?

lag*_*box 5

您可以尝试调整您的中间件以直接在 Response 的标头包上设置标头:

$response = $next($request);

$response->headers->add([
    'Access-Control-Allow-Origin' => '*',
     ...
]);

return $response;
Run Code Online (Sandbox Code Playgroud)

所有来自的响应都应该从基础 Symfony Response 扩展而来,它有一个公共$headers属性,即HeaderBag. 所以这应该适用于所有响应。