2008-10-14 8 views
1

J'ai créé un morceau DOM PHP XML et enregistré sur une chaîne comme ceci:Créer PHP DOM fichier xml et créer un sans écrire le fichier lien Enregistrer le fichier/prompt au serveur lorsque les en-têtes déjà envoyés

<?php 
    // create a new XML document 
    $doc = new DomDocument('1.0'); 
    ... 
    ... 
    ... 
    $xmldata = $doc->saveXML(); 
?> 

Maintenant, je ne peux pas utiliser les en-têtes pour envoyer une invite de téléchargement de fichier et je ne peux pas écrire le fichier sur le serveur, ou plutôt je ne veux pas que le fichier traîne dessus.

Quelque chose comme un lien enregistrer ce fichier ou une invite de téléchargement serait bon. Comment fait-on ça?

+0

Qu'est-ce qui vous empêche d'utiliser les en-têtes pour envoyer une invite de téléchargement de fichier? – Wayne

+0

Mes en-têtes sont déjà écrits, je travaille depuis l'intérieur d'un framework CMS (Drupal). Ainsi, je suis limité à juste avoir un morceau de code dans la page exécutée et si je me souviens bien des choses, vous ne pouvez pas écrire de nouveaux en-têtes une fois qu'ils ont été écrits ou quelque chose a été sortie. –

+0

Reed - pouvez-vous ajouter le commentaire clarifiant ci-dessus à la question? –

Répondre

6

Je vois des commentaires que vous travaillez à partir d'un cadre de la CMS et sont incapables d'arrêter le contenu d'être sortie avant où votre code sera.

Si le script dans lequel vous travaillez a déjà généré du contenu (hors de votre contrôle), vous ne pouvez pas réaliser ce que vous essayez d'obtenir en un seul script. Votre script peut soit envoyer des en-têtes indiquant "le contenu suivant est HTML" puis afficher le HTML ou envoyer des en-têtes en disant "le contenu suivant est XML, est une pièce jointe et a un certain nom de fichier". Vous ne pouvez pas faire les deux.

Vous pouvez soit sortir du HTML contenant un lien vers un script séparé pour télécharger un fichier XML, soit lancer un téléchargement de fichier et sortir le code HTML.

Par conséquent, vous devrez ajouter un lien de téléchargement dans la sortie du script CMS que vous modifiez, puis gérer le téléchargement dans un script séparé.

J'ai fait un exemple de travail qui devrait aider. L'exemple inclut un document HTML simple contenant un lien de téléchargement, et un script PHP qui gère ensuite le téléchargement.

Voir le code ci-dessous ou jeter un oeil à la live example.

HTML (duvet étranger enlevé, pas nécessairement valide)

<html> 
<head> 
<title>XML Download Example</title> 
</head> 

<body> 

<a href="download.php">Download XML example</a> 

</body> 
</html> 

PHP

<?php 
// Populate XML document 
    $doc = new DomDocument(); 
    // ... various modifications to the document are made 

// Output headers 
    header('Content-type: "text/xml"; charset="utf8"'); 
    header('Content-disposition: attachment; filename="example.xml"'); 

// Output content 
    echo $doc->saveXML(); 
?> 

Si vous êtes totalement incapable de gérer le téléchargement via un second script (peut-être vous pouvez ne pas avoir accès aux données pertinentes), vous devrez repenser le problème.

+0

Je pense que vous avez frappé l'endroit. En fait, je ne comprenais pas le concept des en-têtes, c'est-à-dire lorsque vous définissez des en-têtes, vous définissez un type de fichier qui donne au navigateur une idée de ce qu'il doit faire. J'espérais pouvoir travailler depuis le CMS avec ses fonctinos n'ayant pas de fichier externe, mais cela ne semble pas possible. –

1

La même chose a fonctionné pour moi. Mais je n'utilise pas XML DOM. j'utilise SimpleXML pour analyser mon xml.

$ xml = new SimpleXMLElement ("<racine> </racine >");

Je veux donner à ma vue un XML personnalisé qui sera généré en fonction des données qu'ils donnent à travers le formulaire. En soumettant le formulaire ils obtiennent le xml en téléchargement avec leur propre nom désiré.

header ('Content-Type: "text/xml"; charset = "UTF8"); ( pièce jointe; filename = "'. $ _ POST [' nomfichier '].' .xml" ');

echo $ xml-> asXML();