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

如何实现请假申请提交后生成的PDF在新标签页打开?

实现请假申请提交后在新标签页打开生成的PDF

针对你的Laravel项目需求,提供两种可行方案:

方案一:表单提交直接在新标签页打开PDF(简单直接)

1. 修改前端表单

给提交请假申请的表单添加target="_blank"属性,让表单请求在新标签页中处理:

<form action="{{ route('leave.submit') }}" method="POST" target="_blank">
    <!-- 表单内容 -->
</form>

2. 修改后端生成PDF的代码

移除原有的重定向逻辑,改为返回PDF的流式响应,让浏览器直接在新标签页打开文件:

// 获取最新请假记录ID
$id = DB::table('leave')->where('user_id', auth()->user()->id)->max('id');
// 获取请假数据(用first()替代get()[0]更高效)
$data = leave::where('id', $id)->first();

// 生成PDF文件名
$filename = auth()->user()->name . " - S - LEAVE - " . $randomString->randomString(8) . "-" . $request->filing_date . ".pdf";
$path = storage_path('app/leave_file/' . $filename);

// 生成并保存PDF到本地
PDF::loadView('pdf_views.leave_pdf', $data)->setPaper('legal')->save($path);

// 记录文件到数据库(复用已获取的$id,避免重复查询)
if (file_exists($path)) {
    DB::table('leave_files')->insert([
        'filename' => $filename,
        'leave_id' => $id,
    ]);
}

// 返回PDF响应,设置为浏览器内打开(inline)而非下载
return response()->file($path, [
    'Content-Type' => 'application/pdf',
    'Content-Disposition' => 'inline; filename="' . $filename . '"'
]);

方案二:提交后返回列表页,自动打开PDF(适合需要保留列表页状态的场景)

1. 配置存储公共访问

在config/filesystems.php中添加自定义磁盘配置,让生成的PDF可以通过URL访问:

'disks' => [
    // 其他磁盘配置...
    'leave_files' => [
        'driver' => 'local',
        'root' => storage_path('app/leave_file'),
        'url' => env('APP_URL') . '/storage/leave_file',
        'visibility' => 'public',
    ],
]

执行命令创建存储目录的软链接,让外部可以访问:

php artisan storage:link

2. 修改后端代码

保存PDF后,携带PDF的公共URL重定向回列表页:

$id = DB::table('leave')->where('user_id', auth()->user()->id)->max('id');
$data = leave::where('id', $id)->first();

$filename = auth()->user()->name . " - S - LEAVE - " . $randomString->randomString(8) . "-" . $request->filing_date . ".pdf";
$path = storage_path('app/leave_file/' . $filename);

PDF::loadView('pdf_views.leave_pdf', $data)->setPaper('legal')->save($path);

if (file_exists($path)) {
    DB::table('leave_files')->insert([
        'filename' => $filename,
        'leave_id' => $id,
    ]);
}

// 获取PDF的公共访问URL
$pdfUrl = Storage::disk('leave_files')->url($filename);

// 携带成功提示和PDF URL重定向
return redirect()->route('leave')->with([
    'success' => "success",
    'pdf_url' => $pdfUrl
]);

3. 前端添加自动打开逻辑

在请假列表页(leave路由对应的视图)中添加脚本,检测到pdf_url会话数据时自动打开新标签:

@if(session('pdf_url'))
<script>
    window.open('{{ session('pdf_url') }}', '_blank');
</script>
@endif

内容的提问来源于stack exchange,提问作者Imagine Wagons

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 15:09:24