使用laravel-dompdf生成PDF报错:getimagesize()目录读取失败
解决laravel-dompdf生成PDF时getimagesize读取目录报错的问题
错误原因
报错getimagesize(): Read of 8192 bytes failed with errno=21 Is a directory的核心原因是:dompdf在渲染视图时,试图调用getimagesize()读取目录路径而非图片文件路径,导致函数执行失败。该问题与内存限制、上传大小无关,之前的优化方向不对。
解决方案
检查视图中的图片引用
打开fee_vouchers.saved_voucher视图文件,逐一核对所有<img>标签的src属性:- 确保路径指向具体图片文件(如
/images/invoice-logo.jpg),而非目录(如/images/); - 如果使用Laravel的
asset()或storage_url()辅助函数生成路径,确认函数返回的是有效文件路径,而非文件夹路径。
- 确保路径指向具体图片文件(如
排查动态传递的图片路径
检查$data数组中与图片相关的字段,确认这些字段的值是文件路径而非目录路径。可以临时添加调试代码验证:// 在loadView前验证$data中的图片路径 foreach ($data as $key => $value) { if (str_contains($key, 'image') || str_contains($key, 'img')) { if (!is_file(public_path($value))) { dd("Invalid path for {$key}: {$value}"); } } }简化视图定位问题
临时将fee_vouchers.saved_voucher视图简化为纯文本内容,去掉所有图片引用,测试是否能正常生成PDF。如果可以,再逐个添加图片,定位到触发报错的具体图片路径。验证dompdf的图片加载配置
打开config/dompdf.php配置文件,确认:- 本地图片加载路径是否可访问,避免因权限或路径解析错误导致dompdf误把目录当文件;
enable_remote配置仅在需要加载远程图片时开启,本地图片无需开启该选项。
代码优化建议
在生成PDF前,提前验证所有图片路径的有效性,避免无效路径进入dompdf渲染流程:
// 示例:验证$data中的image_path字段 if (isset($data['image_path']) && !is_file(public_path($data['image_path']))) { throw new \RuntimeException("图片路径无效:{$data['image_path']}"); } $pdf = \Barryvdh\DomPDF\Facade\Pdf::loadView( 'fee_vouchers.saved_voucher', $data ); $output = $pdf->setPaper('a4', 'landscape') ->setWarnings(false) ->output(); Storage::put($full_path, $output);
内容的提问来源于stack exchange,提问作者MUHAMMAD Siyab
相关产品推荐
相关产品推荐

