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

Laravel从存储加载动态图片生成PDF时程序停滞问题

解决Laravel mPDF封装加载动态图片导致进程挂起的问题

我之前也碰到过类似的mPDF加载动态图片卡死的情况,结合你的代码细节来看,大概率是这几个原因,对应的解决办法可以试试:

1. mPDF无法解析Storage生成的Web URL

Storage::url()生成的是需要通过HTTP访问的相对/绝对URL,但mPDF在服务器端渲染时,可能没办法正常通过HTTP请求获取本地存储的图片(比如本地环境没有配置正确的域名,或者权限限制导致请求阻塞),进而导致进程一直等待响应最终挂起。

解决办法:使用本地文件绝对路径替代Web URL
直接用Storage::path()获取图片在服务器上的物理路径,mPDF可以直接读取本地文件:

@foreach($employeeMedCert as $med)
    <img src="{{ Storage::path($med->attachment) }}">
@endforeach

如果路径识别有问题,也可以给路径加上file://前缀(部分环境需要):

<img src="file://{{ Storage::path($med->attachment) }}">

2. 图片格式/编码异常导致mPDF处理阻塞

虽然图片体积不大,但带特殊EXIF信息、非标准编码的图片,可能会让mPDF的图片解析逻辑出现异常,进而卡住进程。

解决办法1:上传时预处理图片
用Intervention Image库对上传的图片重新编码,转换成标准的JPG/PNG格式:

// 上传控制器中修改
use Intervention\Image\Facades\Image;

$file = request('file');
// 重新编码为标准JPG,保留90%质量
$processedImage = Image::make($file)->encode('jpg', 90);
// 保存到存储
$path = Storage::putFile('public/employees', $processedImage, 'public');

// 后续创建记录的代码不变
employeeAttachment::create([
    'attachment' => $path,
    'attachmentType' => Storage::mimeType($path),
    'category' => $request->type,
    'endDate' => $request->dueDate,
    'date' => $request->date,
    'employeeID' => $employee,
    'createdBy' => Auth::id()
]);

解决办法2:将图片转为Base64嵌入HTML
把图片内容编码成Base64直接写在img标签里,避免mPDF去外部读取文件:

@foreach($employeeMedCert as $med)
    @php
        // 获取图片内容并编码
        $imageBase64 = base64_encode(Storage::get($med->attachment));
        $mime = Storage::mimeType($med->attachment);
    @endphp
    <img src="data:{{ $mime }};base64,{{ $imageBase64 }}" alt="员工照片">
@endforeach

这种方式虽然会让HTML体积变大,但稳定性很高,完全避免了外部文件读取的问题。

3. mPDF配置或PHP内存限制不足

mPDF处理图片需要一定的内存,默认配置的内存限制或超时时间不足,也可能导致进程崩溃挂起。

解决办法:调整内存和超时配置

  • 如果发布了mPDF的配置文件(config/pdf.php),可以修改参数:
return [
    'mPDF' => [
        'memory_limit' => '256M', // 提升内存限制
        'curl_timeout' => 10,     // 设置请求超时时间
        // 其他配置...
    ]
];
  • 也可以在生成PDF的控制器代码中临时调整PHP内存:
// 临时提升内存限制
ini_set('memory_limit', '256M');
$pdf = PDF::loadView('你的视图名称', $data);

额外注意:修正Blade语法错误

你提供的Blade代码里多了多余的大括号{,虽然可能不影响输出,但可能导致HTML解析异常,建议修正:

// 错误写法
@foreach($employeeMedCert as $med){ <img...> @endforeach
// 正确写法
@foreach($employeeMedCert as $med)
    <img src="{{...}}">
@endforeach

可以先测试用本地静态图片的绝对路径替换动态路径,确认PDF能正常生成后,再针对性解决动态图片的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:26:33