如何实现请假申请提交后生成的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
相关产品推荐
相关产品推荐

