检查特定 Mime 类型的浏览器支持?

18
对于一款允许在浏览器中预览文档的网络应用,我想检查用户的浏览器是否支持当前文档 MIME 类型的预览。
是否有基于 JavaScript 的方法来将当前 MIME 类型与浏览器支持的类型进行匹配呢?
谢谢!

当浏览器从您想要执行此操作的服务器请求页面时,它会通过接受HTTP请求标头发送文档类型列表。因此,您实际上可以在显示页面之前就知道这一点(并且您可以通过将其嵌入响应中使该信息对JavaScript可用)。当然,这需要您动态响应初始请求,并可能不是您要寻找的内容。 - T.J. Crowder
1
@T.J.Crowder:我刚刚测试了读取http接受头的方法。不幸的是,检索到的信息并不是很有用。 Firefox中的Accept头是:“text / html,application / xhtml + xml,application / xml; q = 0.9,*/;q=0.8” IE只有“/*”。 为什么包含的信息这么少呢? - Windwalker
@Windwalker:我不知道。真遗憾... - T.J. Crowder
@T.J.Crowder: 我发现IE在刷新时发送“* / ”接受标头,请参阅:http://www.gethifi.com/blog/browser-rest-http-accept-headers。 不幸的是,接受标头的内容取决于所请求的资源。对于我正在处理的ajax请求,没有包含有关图像、PDF或办公支持的信息。 只需打开Firebug(或类似工具)并浏览www.yahoo.com,查看跟踪即可。接受标头取决于所请求资源的类型。对于图像,包含“image/png,image/;q=0.8,*/*;q=0.5”。 如果我只能强制执行ajax请求... - Windwalker
@Windwalker,你有没有找到可行的解决方案?我自己也在研究完全相同的问题,这里的任何答案都不令人满意。navigator.plugins示例甚至没有支持'text/plain'或各种图像格式,因此没有用处。 - John Rix
显示剩余3条评论
4个回答

4
在最近的浏览器中有一个类似数组的对象navigator.plugins。您可以检查每个插件是否支持您的mime类型。
以下是解决方案代码和在线演示链接:gistjsfiddle
var mimeCheck = function (type) {
    return Array.prototype.reduce.call(navigator.plugins, function (supported, plugin) {
        return supported || Array.prototype.reduce.call(plugin, function (supported, mime) {
            return supported || mime.type == type;
        }, supported);
    }, false);
};

7
可以正常工作,但在Chrome浏览器中显示"image/jpg"不受支持。是否有方法可以包括所有类型,包括图片? - Sathish Santhosam
@Тёма Пендюрин 它能识别浏览器插件吗?我安装了一个视频播放器,但它仍然显示“video/mp4”不受支持。此外,“text/plain”和“image/*”被错误地标记为“不支持”。你能描述一下它应该如何工作,或者证明它是否按照预期工作吗? - marcel
1
更新:在测试了多种 MIME 类型(https://wiki.selfhtml.org/wiki/MIME-Type/%C3%9Cbersicht)后,它只适用于 application/pdf - marcel

2
您可以进行AJAX调用,并检查响应头部的MIME类型。
 $.ajax({
    type: "GET",
    url: 'http://..../thing.pdf',
    success: function (output, status, xhr) {
      alert("done!"+ xhr.getAllResponseHeaders());
      alert("done!"+ xhr.getResponseHeader("Content-Type"));
    }
  });

谢谢你的提示,听起来很有希望。不幸的是,在IE中,对二进制文件的Ajax调用无法工作,请参见:https://dev59.com/3GHVa4cB1Zd3GeqPpryd - Windwalker
啊,糟糕,它似乎总是停在IE上,不是吗 :( - Timmetje
想法:你可以创建一个代理,例如:proxy.php?file=document.pdf。IE不会将其处理为二进制文件。而且你可以在代理中设置响应头。只需通过mime类型等即可。 - Timmetje
似乎你可以使用VB脚本黑客来使其工作。祝你好运找到解决方案! - Timmetje
2
我尝试过了。但不幸的是,这并没有回答问题,即用户的浏览器是否可以显示当前文档的 MIME 类型... - Windwalker
猜想我们被打败了。希望你能找到解决方案。 - Timmetje

1

抱歉,那并不完全符合我的情况。 我是客户端,即Javascript(而不是所提到的PHP问题),我有一个特定MIME类型的文档,并且我想决定是否 a)打开内部预览,例如 <iFrame src="<URL to document>"></iFrame> 或者 b)跳过内部预览,如果不支持MIME类型。 - Windwalker

0

如果您定义了特定文档类型所需的插件,则可以尝试查看所需的插件是否存在。应该至少在Firefox和Chrome上可用。 window.navigator.plugins

(注意:由于技术术语等原因,翻译可能不是唯一正确的表达方式。)

1
实际上问题是,我们的客户几乎都在使用IE,因为它对于大多数公司来说是相当标准的。如果你总是不得不处理老式浏览器,那真是太糟糕了... - Windwalker
1
Chrome正在针对该示例链接显示明亮红色的“恶意软件”警告。 - John Rix
似乎链接已经损坏,已将其删除。这个想法在Mozilla的页面上也可以看到。 - Aivar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接