在 php 中更改输出的 mime 类型

Posted

技术标签:

【中文标题】在 php 中更改输出的 mime 类型【英文标题】:change mime type of output in php 【发布时间】:2010-09-14 04:47:18 【问题描述】:

我有一个 php 脚本。大多数情况下,脚本返回 html,这工作正常,但有时(参数 ?Format=XML)脚本返回 XML 而不是 HTML。

有什么方法可以将返回的 php 输出的 mime 类型从 text/html 更改为 text/xml 或 application/xml?

【问题讨论】:

你能提供更多关于你想要做什么的信息吗?即RSS,xhtml等?我还发现了这个错误:support.microsoft.com/kb/264868 确保在输出任何文本之前使用标题调用 哇,我的错误,它在 IE 中工作 - 我的 XML 生成代码有一个很大的错误(我从一些教程中复制了它,并没有真正阅读输出行,它将 XML 转换为HTML 使用 htmlentities。对不起!!! PS.:既然您想知道,似乎在 SO 上,用法是选择第一个正确答案... :-) 这是合乎逻辑的。 是的,似乎是最好的方法 - 即使其他答案包含有效点,第一个答案也丢失了(在任何其他输出之前发送,使用 application/xml 而不是 text/xml)。谢谢! 【参考方案1】:
header('Content-Type: application/xml; charset=utf-8');

您也可以在同一行中添加编码。我加了utf-8,这个是最常见的。

【讨论】:

【参考方案2】:

我刚刚使用了以下内容: 注意:我将“i”用于 sql 改进扩展。

Start XML file, echo parent node
header("Content-type: text/xml");
echo "<?xml version='1.0' encoding='UTF-8'?>";
echo "<marker>";

遍历行,为每个行打印 XML 节点

while ($row = @mysqli_fetch_assoc($results))
  // Add to XML document node
  echo '<marker ';
  echo 'id="' . $ind . '" ';
  echo 'name="' . parseToXML($row['name']) . '" ';
  echo 'address="' . parseToXML($row['address']) . '" ';
  echo 'lat="' . $row['lat'] . '" ';
  echo 'lng="' . $row['lng'] . '" ';
  echo 'type="' . $row['type'] . '" ';
  echo '/>';


// End XML file
echo "</marker>";

【讨论】:

【参考方案3】:

您应该在发送任何输出之前发送Content-Type 标头

header('Content-Type: text/xml');

【讨论】:

【参考方案4】:
header('Content-type: application/xml');

更多信息请参见header() 的 PHP 文档

【讨论】:

发生在我身上的是,Microsoft Visual Studio API 生成 Web 服务客户端不喜欢“application/xml”,而是需要“text/xml”。【参考方案5】:

我会回答更新,因为以前的答案很好。 我读过 Internet Explorer 以忽略 Mime 类型标头(大部分时间?)以依赖文件内容(在某些情况下可能导致问题)而闻名。

嗯,我做了一个简单的测试:

<?php
header('Content-Type: text/xml');
echo '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root><foo a="b">Tada</foo></root>';
?>

Internet Explorer 6 将其正确显示为 XML。即使我删除了 xml 声明。 您应该指出哪个版本有问题。

实际上,正如我在上面所写的,对于 IE(至少 6 个),您甚至不需要内容类型,它可以识别 XML 数据并将其显示为树。你的 XML 正确吗?

[更新] IE7 也试过了,也添加了 ?format=xml,仍然正确显示 XML。如果我发送格式错误的 XML,IE 会显示错误。在 WinXP Pro SP2+ 上测试

【讨论】:

对不起,我的错误,我复制的示例代码确实通过htmlentities发送了XML进行输出,直到现在我才注意到! 啊!好的。 :-) 我们都从错误中学习(甚至是其他人的错误!)。 我认为 IE 6 有问题的是 text/xhtml;我从来没有玩过它,但我听到了很多关于它的抱怨。我相信如果您发送 text/xhtml,IE 6 将无法正常工作,但我不确定。 一种 IE 存在问题的类型是 XHTML,即 application/xhtml+xml 或 application/xml -- IE 不会呈现使用这些正确内容类型中的任何一种发送的 XHTML(您可以错误地发送为text/html 强制 IE 使用其 HTML 模式,但这是错误的,可能会导致其他副作用)。【参考方案6】:

设置Content-Type 标头:

header('Content-Type: text/xml');

虽然您可能应该改用“application/xml”。

【讨论】:

你明白了 - text/xml 和 application/xml 之间有什么区别? text/*内容类型HTTP关于编码的交互,主要见annevankesteren.nl/2005/03/text-xml 缓存代理可以编辑text/*来改变字符编码。由于 XML 还在文档本身中声明了其字符编码,因此您真的不希望发生这种情况,因为您可能会遇到不匹配的情况。所以请改用application/xml,缓存代理会将内容视为二进制数据并使其不受干扰。

以上是关于在 php 中更改输出的 mime 类型的主要内容,如果未能解决你的问题,请参考以下文章

在 drupal 7 中更改 CDN 中的视频内容类型(mime 类型)

在没有Web.Config的情况下更改Azure上的接受MIME类型

在将其保存在服务器上之前更改 mime 类型的图片

PHP - 使用正确的 MIME 类型打开上传的 DOCX 文件

在 PHP 中使用 MIME 的电子邮件文件附件

更改 PHP 邮件函数中的返回路径