2017-09-26 5 views
2

Je transfère des fichiers html vers d'autres serveurs. Ce que je fais est, je prends le format HTML original, je fais un peu d'analyse pour se débarrasser de la tête et d'autres choses.

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)); 
} 

Ce code n'est pas un problème. Dans $ body maintenant j'ai du HTML propre, ce qui est bien.

J'ai besoin d'images encodent de base46 en html d'origine, pour chaque nœud, qui a noeud img, je reçois le fichier, que src d'origine pointe vers

$picture = file_get_contents($item_path); 

et je base64 encoder

$picture_data = base64_encode($picture); 

Si je vide le $ picture_data, j'obtiens la bonne chaîne encodée en base64. je puis écrasent nœud avec cet attribut src

$node->setAttribute("src", "data:image/jpeg;base64,".$picture_data); 

Et si je var_dump $ node-> getAttribute ("src"), l'attribut src de ce noeud est remplacé correctement avec la chaîne looooong. Ce qui est bon.

vient ici le problème:

$html = $body->saveHTML(); 

var_dumping $ montre html, que la dernière base64 chaîne de l'image codée est coupée à la même position chaque fois. Cette dernière image est plus 1Mo taille ..

C'est, par exemple, mon html qui ne marche pas le travail:

<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> 

MAIS! si j'ajouter un autre élément à la fin comme ceci:

<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> 

il commence à travailler comme prévu et codé en base64 la chaîne de l'image est terminée par // Z, cette chaîne html est transférée à d'autres serveurs et photos montre sur ce serveur. Fonctionne aussi, si je change l'ordre de ces deux images, en mettant un plus petit à la place du grand et un grand au début du corps ..

Qu'est-ce qui me manque?

EDIT1: J'ai essayé de le définir par php, mais avec une image de base64 plus élevée, le code source est trop grand (la limite est 250k). J'ai utilisé le même, plus petit, image deux fois et cette erreur ne se produit pas.

http://phpfiddle.org/main/code/x3gc-4rp7

Je suppose donc qu'il a quelque chose à voir avec la taille de l'image/longueur ..

EDIT2: Ajout chunk_split() autour base64_encode() ne marche pas aider non plus. J'ai le var_dumped noeud entier, pas seulement l'attribut "src" et le noeud lui-même est correctement formé, chaîne base64 est entière.

Répondre

0

J'ai eu le même problème et j'ai trouvé une alternative pour saveHTML().Vous pouvez utiliser ceci:

$full_dom->documentElement->c14n(); 

Vous obtiendrez le plein HTML complet sans être coupé.