【问题标题】:Create PHP DOM xml file and create a save file link/prompt without writing the file to the server when headers already sent创建 PHP DOM xml 文件并创建保存文件链接/提示,而不在已发送标头时将文件写入服务器
【发布时间】:2008-10-14 18:37:58
【问题描述】:

我创建了一个 PHP DOM xml 片段并将其保存为如下字符串:

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

现在我无法使用标头发送文件下载提示,也无法将文件写入服务器,或者更确切地说,我不希望文件放在上面。

保存此文件链接或下载提示之类的东西会很好。我该怎么做?

【问题讨论】:

  • 是什么阻止您使用标头发送文件下载提示?
  • 我的标头已经写好了,我在 CMS 框架(Drupal)内部工作。因此,我仅限于执行页面中的一段代码,如果我没记错的话,一旦写入或输出某些内容,您就无法编写新的标题。
  • Reed - 你能在问题中添加上述澄清评论吗?

标签: php xml dom file


【解决方案1】:

我从 cmets 中看到,您在 CMS 框架内工作,并且无法在您的代码所在位置之前阻止内容被输出。

如果您正在使用的脚本已经输出了内容(超出您的控制范围),那么您无法仅在一个脚本中完成您想要实现的目标。

您的脚本可以发送标头说“以下内容是 HTML”然后输出 HTML,或者发送标头说“以下内容是 XML,是附件并且具有特定文件名”。你不能两者都做。

您可以输出包含指向用于下载 XML 文件的单独脚本的链接的 HTML,也可以发出文件下载但不输出 HTML。

因此,您必须在正在修改的 CMS 脚本的输出中添加下载链接,然后在单独的脚本中处理下载。

我已经做了一个应该有所帮助的工作示例。该示例包括一个简单的 HTML 文档,其中包含一个下载链接,以及一个用于处理下载的 PHP 脚本。

查看下面的代码或查看live example

HTML(去除多余的绒毛,不一定有效)

<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();
?>

如果您完全无法通过第二个脚本处理下载(也许您无法访问相关数据),您将不得不重新考虑问题。

【讨论】:

  • 我认为你说得对。我基本上误解了标头的概念,即当您设置标头时,您设置了文件类型,这为浏览器提供了一些关于该做什么的线索。我希望我可以在 CMS 内部工作,它的功能没有外部文件,但这似乎是不可能的。
【解决方案2】:

您可以在 php.ini 中启用 output_buffering,然后您可能会有一些发送标头的选项。

http://us.php.net/manual/en/function.headers-sent.php

【讨论】:

    【解决方案3】:

    同样的事情对我有用。但我没有使用 XML DOM。我使用 SimpleXML 来解析我的 xml。

    $xml = 新的 SimpleXMLElement("");

    我想为我的视图提供一个自定义 xml,该 xml 将根据他们通过表单提供的数据生成。在提交表单时,他们会以自己想要的名称下载 xml。

    header('内容类型:"text/xml"; charset="utf8"');

    header('内容配置: 附件; filename="'.$_POST['filename'].'.xml"');

    echo $xml->asXML();

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-27
      • 2011-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多