通过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
相关产品推荐
相关产品推荐

