使用Laravel+Dompdf生成PDF遇unlink(.png)错误求助
解决Laravel + Dompdf生成PDF时的
unlink(.png): No such file or directory错误 我来帮你搞定这个头疼的问题!你遇到的这个错误,本质是Dompdf处理图片临时文件时出了岔子——要么是图片路径没被正确识别,要么是临时文件的配置没真正生效。结合你的操作和代码,咱们一步步来修复:
1. 别直接修改dompdf源码配置,用Laravel动态配置更靠谱
你之前改了dompdf/options.php里的临时目录,但这种硬编码的方式在Laravel项目里不推荐,而且可能因为框架的配置优先级问题没生效。正确的做法是在生成PDF时动态设置选项:
$pdf = PDF::loadView('pdf.otp', compact('data')) ->setOptions([ 'tempDir' => 'C:/Temp', // 确保这个目录确实存在 'chroot' => public_path(), // 关键!设置Dompdf可访问的根目录为public文件夹 'isHtml5ParserEnabled' => true, // 启用HTML5解析,避免路径解析问题 ]);
这里的chroot非常重要,它限制了Dompdf只能访问指定目录下的文件,设置成public_path()后,Dompdf就能正确找到你public目录下的图片了。
2. 修正Blade里的图片路径格式
你当前的图片路径写法可能让Dompdf无法识别本地文件,尤其是Windows系统下的路径分隔符问题。改成带file://协议的格式,同时处理反斜杠:
<?php // 拼接正确的本地绝对路径 $image_path = public_path('storage/signatures/' . $independent->signature); // Windows下把反斜杠换成正斜杠,Dompdf更偏好这种格式 $image_path = str_replace('\\', '/', $image_path); ?> <img src="file://{{ $image_path }}" style='width:150px;height:50px;'>
为什么要加file://?因为Dompdf默认会把路径当成Web URL,加上这个协议后,它才会知道这是本地服务器上的文件。
3. 再确认一次临时目录的权限
虽然你说给了C:/Temp完全权限,但要确保是运行Web服务器的用户拥有读写权限:
- 如果用的是XAMPP/WAMP,通常是当前登录用户
- 如果是IIS,要给
IUSR和IIS_IUSRS用户权限 - 如果是Linux服务器,要给
www-data用户权限
可以手动在C:/Temp里创建一个测试文件,看看Web服务器能不能读写它,彻底排除权限问题。
最后试试完整的修改后的代码
Blade文件(show.blade.php)
<?php $image_path = public_path('storage/signatures/' . $independent->signature); $image_path = str_replace('\\', '/', $image_path); ?> <img src="file://{{ $image_path }}" style='width:150px;height:50px;'>
Controller代码
$pdf = PDF::loadView('pdf.otp', compact('data')) ->setOptions([ 'tempDir' => 'C:/Temp', 'chroot' => public_path(), 'isHtml5ParserEnabled' => true, ]); // 测试下载PDF return $pdf->download('document.pdf');
按照这个步骤来,应该就能解决unlink的错误,正常生成带图片的PDF了!
内容的提问来源于stack exchange,提问作者Charl Scholtz
相关产品推荐
相关产品推荐

