在 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类型