You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中如何在加载新视图前先完成PDF下载?

解决Laravel生成PDF后先下载再跳转视图的问题

由于HTTP协议限制,一次请求只能返回一个响应,无法同时返回文件下载和页面跳转。可以通过以下两种方案实现需求:

方案一:使用下载响应+Refresh响应头

在生成并保存PDF后,返回文件下载响应,同时通过Refresh头指定下载完成后自动跳转至目标页面。

修改控制器代码:

public function formularSave(Request $request) {
    if(!$request->has('token')) {
        abort(404);
    }

    $token = $request->token;

    Application::where('token', $token)->update([
        'status' => 22
    ]);

    $result = "Registration complete.";
    // 将结果存入session,跳转后读取
    session()->flash('result', $result);
    
    $html = 'Some test code here
        <br>
        <p>Date: '.date('d.m.Y H:i:s').'</p>
    ';

    $pdf = PDF::loadHTML($html);
    $filename = substr(md5(uniqid().time()), 0, 17) . '.pdf';
    $filePath = storage_path('app/public/uploads/rezolutii/'.$filename);
    $pdf->save($filePath);
    
    // 返回下载响应,设置3秒后跳转到注册完成页面
    return response()->download($filePath, $filename)
        ->header('Refresh', '3; url='.route('register.complete'));
}

补充注册完成页面的路由与控制器:

  1. 在路由文件中定义跳转目标路由:
Route::get('/register-complete', [YourController::class, 'registerComplete'])->name('register.complete');
  1. 添加对应控制器方法:
public function registerComplete() {
    $result = session()->get('result');
    return view('site.pages.registercomplete', compact('result'));
}

方案二:前端触发下载+延迟跳转

返回注册完成视图,在视图中通过JavaScript自动触发PDF下载,再按需延迟跳转。

修改控制器代码:

public function formularSave(Request $request) {
    if(!$request->has('token')) {
        abort(404);
    }

    $token = $request->token;

    Application::where('token', $token)->update([
        'status' => 22
    ]);

    $result = "Registration complete.";
    
    $html = 'Some test code here
        <br>
        <p>Date: '.date('d.m.Y H:i:s').'</p>
    ';

    $pdf = PDF::loadHTML($html);
    $filename = substr(md5(uniqid().time()), 0, 17) . '.pdf';
    $pdf->save(storage_path('app/public/uploads/rezolutii/'.$filename));
    
    // 生成PDF的可访问URL(需确保已执行php artisan storage:link)
    $pdfUrl = Storage::url('uploads/rezolutii/'.$filename);
    
    return view('site.pages.registercomplete', compact('result', 'pdfUrl', 'filename'));
}

在注册完成视图中添加JavaScript:

<script>
// 自动触发PDF下载
const downloadLink = document.createElement('a');
downloadLink.href = "{{ $pdfUrl }}";
downloadLink.download = "{{ $filename }}";
document.body.appendChild(downloadLink);
downloadLink.click();
document.body.removeChild(downloadLink);

// 可选:延迟1秒后跳转(如果当前视图不是最终目标页面)
setTimeout(() => {
    window.location.href = "{{ url('/your-target-url') }}";
}, 1000);
</script>

注意事项:

  • 确保已执行php artisan storage:link命令,将storage/public目录链接到public/storage,这样生成的PDF才能通过公共URL访问。
  • 方案一中的Refresh头延迟时间可根据需求调整,给浏览器足够的时间触发下载。

内容的提问来源于stack exchange,提问作者Andreea Onica

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 01:21:04