Laravel的 Storage::response() 会返回一个用于下载的响应,而不是在浏览器中直接显示PDF
我在Laravel中尝试在浏览器中将PDF以内联方式显示,但浏览器并未直接打开该文件,而是把它下载了。
以下是我的代码:
return Storage::disk('public')->response(
$path,
$responseFileName,
['Content-Type' => 'application/pdf'],
'inline'
);
该路由通过GET请求访问。
我的预期是PDF应该在浏览器中内联打开,但实际情况却总是触发下载。
我到底哪里没做好?是设置头信息的方式有问题,还是使用 response() 方法有误?
非常感谢任何帮助。
解决方案
Storage::response() 方法常常会强制下载,因为它往往会用自己的默认设置覆盖你的头信息。切换到 response()->file() 是标准的解决办法,因为它不会干扰你的设置,让内联显示命令能够原封不动地到达浏览器。这就确保浏览器实际使用其内置的PDF查看器,而不是把文件直接丢到下载列表中。
$fullPath = Storage::disk('public')->path($path);
return response()->file($fullPath, [
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'inline; filename="' . $responseFileName . '"'
]);
备选方案
或者,你也可以改为内嵌显示?注:这段代码尚未经过测试。
// In your controller
public function show($path)
{
$url = Storage::disk('public')->url($path);
return view('pdf.viewer', compact('url'));
}
<!-- resources/views/pdf/viewer.blade.php -->
<!DOCTYPE html>
<html>
<head>
<style>
body, html { margin: 0; padding: 0; height: 100%; }
iframe { width: 100%; height: 100vh; border: none; }
</style>
</head>
<body>
<iframe src="{{ $url }}" type="application/pdf">
<p>Your browser doesn't support inline PDFs.
<a href="{{ $url }}">Download instead</a>
</p>
</iframe>
</body>
</html>
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。