Laravel的 Storage::response() 会返回一个用于下载的响应,而不是在浏览器中直接显示PDF

前端开发 2026-07-10

我在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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章