创建/保存内联base64编码图像

时间:2012-04-09 00:05:24

标签: php image base64 gd

我正在努力创造&保存来自h64正文中实际图像的base64数据的电子邮件中的数据图像,如下所示:

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAAE==">

但我正在尝试按顺序创建它们,因为html正文中可能有多个图像标记,其中变量$ html_part是电子邮件的html正文。 我只是需要一些帮助来解决我做错了什么。

    $img_tags = preg_match('/<img\s+(.*)>/', $html_part, $num_img_tags);
    $num_img_tags = count($num_img_tags);

    echo $html_part;
    for ($i = 1; $i <= $num_img_tags; $i++) {       
    preg_match('/<img\s+(.*)\s+src="data:image\/(.*);(.*),(.*)"\s+(.*)>/i', $html_part, $srcMatch);
{   
    foreach($srcMatch[4] as $im_data)
    {
        $ufname = "image0".$num_img_tags.".jpg";
        echo "<h1>$ufname</h1>";
            $im_data = base64_decode($im_data);
            $im = imagecreatefromstring($im_data);
            if ($im !== false) {
            header('Content-Type: image/jpeg');
            imagejpeg($im, $ufname);
            imagedestroy($im);
            }
            else {
            echo 'An error occurred.';
            }
    }

}
}

2 个答案:

答案 0 :(得分:1)

很确定你想使用preg_match_all,而不是preg_match

http://php.net/manual/en/function.preg-match-all.php

此外,使用上述解决方案。

<?php

$html_part=<<<END
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAVFBMVEWcZjTcViTMuqT8/vzcYjTkhhTkljT87tz03sRkZmS8mnT03tT89vTsvoTk1sz86uTkekzkjmzkwpT01rTsmnzsplTUwqz89uy0jmzsrmTknkT0zqT3X4fRAAAAbklEQVR4XnXOVw6FIBBAUafQsZfX9r/PB8JoTPT+QE4o01AtMoS8HkALcH8BGmGIAvaXLw0wCqxKz0Q9w1LBfFSiJBzljVerlbYhlBO4dZHM/F3llybncbIC6N+70Q7OlUm7DdO+gKs9gyRwdgd/LOcGXHzLN5gAAAAASUVORK5CYII=">
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAVFBMVEWcZjTcViTMuqT8/vzcYjTkhhTkljT87tz03sRkZmS8mnT03tT89vTsvoTk1sz86uTkekzkjmzkwpT01rTsmnzsplTUwqz89uy0jmzsrmTknkT0zqT3X4fRAAAAbklEQVR4XnXOVw6FIBBAUafQsZfX9r/PB8JoTPT+QE4o01AtMoS8HkALcH8BGmGIAvaXLw0wCqxKz0Q9w1LBfFSiJBzljVerlbYhlBO4dZHM/F3llybncbIC6N+70Q7OlUm7DdO+gKs9gyRwdgd/LOcGXHzLN5gAAAAASUVORK5CYII=">
END;

preg_match_all('/<img.*?src="data:image\/.*;.*,(.*)".*?>/i', $html_part, $img_tags, PREG_PATTERN_ORDER);

echo $html_part;
$img_num = 0;
foreach($img_tags[1] as $im_data)
{
    $ufname = "image0".$img_num.".jpg";
    echo "<h1>$ufname</h1>";
    $im_data = base64_decode($im_data);
    $im = imagecreatefromstring($im_data);
    if ($im !== false) {
        imagejpeg($im, $ufname);
        imagedestroy($im);
    }
    else {
        echo 'An error occurred.';
    }
    $img_num++;
}

答案 1 :(得分:1)

您的代码是不可能的 - 在您执行 ANY 输出后,您无法执行header()调用。您也不能在同一“文档”中输出多个图像。您也无法在同一文档中输出html(<h1>内容),图片(header('Content-type:...')等等...

同样,使用正则表达式解析/处理HTML也很危险。源文档和您的正则表达式的单个畸形将很高兴地为您提供垃圾和生产垃圾。不要在html上使用正则表达式...每次你这样做时,Alan Turing会杀死一只小猫。请改用DOM parser