【发布时间】:2018-03-16 18:08:49
【问题描述】:
我正在将一些 html 传输到其他服务器。 我所做的是,我采用原始 html,我做一些解析以摆脱 head 和东西。
libxml_use_internal_errors(true);
$full_dom->loadHTML($html);
libxml_use_internal_errors(false);
$full_dom = $full_dom->getElementsByTagName('body')->item(0);
foreach($full_dom->childNodes as $child_node) {
$body->appendChild($body->importNode($child_node, true));
}
这段代码没有问题。现在在 $body 中我有了干净的 HTML,这很好。
我需要对原始 html 中的图像进行 base46 编码,对于每个具有节点 img 的节点,我得到了原始 src 指向的文件
$picture = file_get_contents($item_path);
我对它进行base64编码
$picture_data = base64_encode($picture);
如果我转储 $picture_data,我会得到正确的 base64 编码字符串。 然后我用这个 src 属性覆盖节点
$node->setAttribute("src", "data:image/jpeg;base64,".$picture_data);
如果我 var_dump $node->getAttribute("src"),这个节点的 src 属性会被 looooong 字符串正确替换。哪个好。
问题来了:
$html = $body->saveHTML();
var_dumping $html 显示,最后一个base64编码的图片的字符串每次都在相同的位置被截断。最后一张图片大小超过 1MB..
这是,例如,我的 html 不起作用:
<body>
<img src="/content_storage/storage/389/Jellyfish.jpg" alt="" width="133" height="100" /><br /><br /><br />Link do<a href="http://www.subjectx.net"> zunanje vsebine</a><br /><br /><img src="/content_storage/storage/656/WallpaperFusion-lac-de-savine-3840x1200-W.jpg" alt="" width="3840" height="1200" />
</body>
但是!如果我像这样在末尾添加另一个元素:
<body>
<img src="/content_storage/storage/389/Jellyfish.jpg" alt="" width="133" height="100" /><br /><br /><br />Link do<a href="http://www.subjectx.net"> zunanje vsebine</a><br /><br /><img src="/content_storage/storage/656/WallpaperFusion-lac-de-savine-3840x1200-W.jpg" alt="" width="3840" height="1200" /><a href="#">aaa</a>
</body>
它开始按预期工作,base64 编码的图片字符串以 //Z 结尾,这个 html 字符串被传输到其他服务器,图片在该服务器上显示。 也可以,如果我更改这两张图片的顺序,将较小的一张放在大一张的位置,将大的放在正文的开头..
我错过了什么?
编辑1: 我尝试过 phpfiddle 它,但使用较大的图像 base64_encoded,源代码太大(限制为 250k)。我使用了相同的较小的图片两次,但没有发生此错误。
http://phpfiddle.org/main/code/x3gc-4rp7
所以我想这与图片大小/长度有关..
编辑2: 在 base64_encode() 周围添加 chunk_split() 也无济于事。
编辑3: 我有 var_dumped 整个节点,而不仅仅是“src”属性,并且节点本身是正确形成的,base64 字符串是完整的。
【问题讨论】:
-
如果没有深入研究 PHP 的源代码,我无法真正发表评论,但我怀疑 DOMDocument 中的给定 DOM 节点可以容纳多少数据是有上限的。您是否尝试过替换较小的图像并查看它是否有效?另外,请记住,内嵌图像从来都不是很大的!