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

通过Dompdf嵌入POST上传图片不显示问题及代码示例

解决Dompdf无法显示POST上传图片的问题

问题原因

  • 上传的临时文件存储在系统临时目录,不在你设置的__DIR__ chroot路径范围内,Dompdf受限于chroot配置无法访问该路径。
  • PHP的上传临时文件会在脚本执行完毕后自动删除,即使路径配置正确,生成PDF时文件可能已被系统清理。

解决方案1:保存临时文件到本地目录后引用

先将上传的临时文件移动到当前目录(或chroot允许的路径),再在HTML中引用这个本地路径:

<?php
use Dompdf\Dompdf;
use Dompdf\Options;

if ($_FILES['imagem']['error'] === UPLOAD_ERR_OK) {
    $imagem_tmp = $_FILES['imagem']['tmp_name'];
    // 生成唯一文件名避免冲突
    $imagem_nome = 'upload_' . uniqid() . '.' . pathinfo($_FILES['imagem']['name'], PATHINFO_EXTENSION);
    $imagem_caminho = __DIR__ . '/' . $imagem_nome;
    
    // 将临时文件移动到当前目录
    move_uploaded_file($imagem_tmp, $imagem_caminho);
    
    require('vendor/autoload.php');

    $options = new Options();
    $options->setChroot(__DIR__);
    $options->setIsRemoteEnabled(true);

    $dompdf = new Dompdf($options);

    // 引用本地保存的图片路径
    $html = '<html>
               <body>
                 <img src="' . $imagem_nome . '">
               </body>
             </html>';

    $dompdf->loadHtml($html);
    $dompdf->render();

    $nome_pdf = 'meu_pdf.pdf';
    file_put_contents($nome_pdf, $dompdf->output());
    echo 'PDF gerado com sucesso: <a href="' . $nome_pdf . '">Baixar PDF</a>';
    
    // 可选:生成PDF后删除临时上传的图片
    unlink($imagem_caminho);
} else {
    echo 'Erro ao fazer upload da imagem.';
}
?>

解决方案2:将图片转为Base64编码嵌入HTML

直接把图片内容转为Base64字符串,嵌入到img标签的src属性中,无需依赖文件路径:

<?php
use Dompdf\Dompdf;
use Dompdf\Options;

if ($_FILES['imagem']['error'] === UPLOAD_ERR_OK) {
    $imagem_tmp = $_FILES['imagem']['tmp_name'];
    // 获取图片MIME类型
    $imagem_mime = mime_content_type($imagem_tmp);
    // 读取图片内容并转为Base64编码
    $imagem_base64 = base64_encode(file_get_contents($imagem_tmp));
    $imagem_src = "data:$imagem_mime;base64,$imagem_base64";
    
    require('vendor/autoload.php');

    $options = new Options();
    $options->setIsRemoteEnabled(true);

    $dompdf = new Dompdf($options);

    $html = '<html>
               <body>
                 <img src="' . $imagem_src . '">
               </body>
             </html>';

    $dompdf->loadHtml($html);
    $dompdf->render();

    $nome_pdf = 'meu_pdf.pdf';
    file_put_contents($nome_pdf, $dompdf->output());
    echo 'PDF gerado com sucesso: <a href="' . $nome_pdf . '">Baixar PDF</a>';
} else {
    echo 'Erro ao fazer upload da imagem.';
}
?>

关键说明

  • 方案1适合大尺寸图片,避免Base64编码导致HTML体积过大;方案2无需处理文件存储,适合小体积图片场景。
  • 使用方案1时,需确保__DIR__目录具备写入权限,否则move_uploaded_file操作会失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 02:32:36