.rar和.tar文件缺少MIME类型

Javascript(Windows 8.1,Firefox)似乎没有.tar文件或.rar文件的MIME类型(也许是其他的;这些是我找到的唯一两个)。 那是怎么回事? 有什么我可以用来解决这个问题吗? 我真的很希望能够为这些文件类型检索MIME类型,而无需进行一些奇怪的扩展黑客攻击。

我做了一个小提琴来证明这个问题:http://jsfiddle.net/kungfujoe/jd8h7wvs/

如果您浏览到.txt或.docx或其他许多格式,则类型会成功拉取。 但是,.tar和.rar都不会提取它们。 奇怪的,对吧?

(下面的JSFiddle代码)

HTML

<input id='button' type='file' name='file'/>
<div id='out'>Output Goes Here</div>

Javascript(使用JQuery 2.1.0)

$('#button').unbind('change');
$('#button').bind('change', function () {
    if(this.files[0] !== undefined && this.files[0] !== null) {
        document.getElementById("out").innerHTML = "Type is " + this.files[0].type.toString();        
    } else {
        throw "Error"
    }
});

谢谢

编辑

1)更新了问题以反映在Windows 8.1 Firefox上观察到该问题。 Chrome对于tar文件具有mime类型,但不包含rar文件。

2)将jQuery添加到小提琴


JQuery只包装了大多数浏览器中使用的底层File API,所以JQuery和Javascript如何处理文件和MIME类型没有区别。 这里是File API规范:

http://www.w3.org/TR/FileAPI/#dfn-type

您正在操作的File对象继承Blob对象的type属性,并且浏览器使用blob(字节数组)来确定MIME类型。

为了完成这个任务,每个浏览器实现一个文件嗅探算法来从字节数组中读取mime类型,如果mime类型不匹配,它将返回一个空字符串,就像上面的场景一样。

这是完整的算法规范:

https://mimesniff.spec.whatwg.org/

所以现在你想知道为什么它不适用于TAR,ZIP和RAR文件,为什么它对某些人而不是对你有用?因为文件嗅探算法显然不是完美的。

它使用字节模式匹配 ,这似乎不够可靠。

例如,我使用Windows 8的WinRaR压缩文件,并且创建的文件的初始字节为:

52 61 72 21 1A 07 00

但是,要将其识别为.RAR浏览器字节模式匹配算法所期望的

52 61 72 20 1A 07 00

正如你所看到的有一点点不同,当我使用上面的代码将我的RAR文件上传到浏览器时,Firefox无法识别Mime类型,并且我在类型属性中获得了一个空字符串。

然而,当我使用WinRar在默认设置的同一台机器上打包一个ZIP文件时,它会生成一个与算法期望的zip字节模式匹配的初始字节数组序列50 4B 03 04 ,并且当我使用上面的代码时能够正确检测MIME类型作为应用程序/邮编

正如你从我的解释中看到的那样,这是一个序列化问题,以及与浏览器中的序列化字节和MIME扩展匹配的算法的“不完美”。

基于上面提到的一切,我建议不要依赖mime嗅探,而是使用自定义代码来确定mime类型或现有库。 您可以使用服务器端或客户端方法。

如果你想坚持客户端,你可以使用下面的JS库:

https://github.com/rsdoiel/mimetype-js

然后发现MIME类型将是一行代码的问题:

mimetype.lookup("myfile.rar")

这里是一个工作小提琴,升级您的示例使用mimetype js:

http://jsfiddle.net/jd8h7wvs/4/

链接地址: http://www.djcxy.com/p/8259.html

上一篇: Mime type missing for .rar and .tar

下一篇: Which MIME type to return?