Laravel下载文件时出现BinaryFileResponse::withHeaders()未定义方法错误求助
问题修复:Call to undefined method BinaryFileResponse::withHeaders()
错误原因
当请求返回BinaryFileResponse(比如文件下载场景)时,这个响应类属于Symfony的HttpFoundation组件,它并没有Laravel封装的withHeaders()方法,直接调用会触发该错误。
修复方案
修改中间件的header设置逻辑,改用所有Symfony响应类都支持的headers->add()方法,兼容Laravel响应和Symfony响应场景:
修复后的中间件代码
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; class XFrameHeaders { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse|\Symfony\Component\HttpFoundation\BinaryFileResponse) $next * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse|\Symfony\Component\HttpFoundation\BinaryFileResponse */ public function handle(Request $request, Closure $next) { $response = $next($request); // 用Symfony响应通用的headers->add方法设置头信息 $response->headers->add([ 'X-Frame-Options' => 'DENY', 'X-XSS-Protection' => '1; mode=block', 'X-Permitted-Cross-Domain-Policies' => 'master-only', 'X-Content-Type-Options' => 'nosniff', 'Referrer-Policy' => 'no-referrer-when-downgrade', 'Strict-Transport-Security' => 'max-age=31536000; includeSubDomains', 'Cache-Control' => 'no-cache, no-store, must-revalidate, post-check=0, pre-check=0', 'Pragma' => 'no-cache', 'Expires' => 'Sat, 26 Jul 1997 05:00:00 GMT', ]); return $response; } }
额外说明
headers->add()是Symfony HttpFoundation组件中所有响应类都支持的方法,包括BinaryFileResponse和Laravel封装的Response、RedirectResponse,能覆盖所有响应场景。- 更新了方法注释中的返回类型声明,加入
BinaryFileResponse,让类型提示更准确。
内容的提问来源于stack exchange,提问作者Yeabkal Habtamu
相关产品推荐
相关产品推荐

