.rar和.tar缺少Mime类型

Cod*_*y S 10 javascript jquery mime-types

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>
Run Code Online (Sandbox Code Playgroud)

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"
    }
});
Run Code Online (Sandbox Code Playgroud)

谢谢

编辑

1)更新了问题,以反映在Windows 8.1 Firefox上观察到的问题.Chrome有tar文件的mime类型,但不是rar文件.

2)向小提琴添加了jQuery

Far*_*ina 13

JQuery只包含大多数浏览器中使用的底层File API,因此JQuery和Javascript如何处理文件和mime类型没有区别.这是File API规范:

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

File您正在操纵对象继承的类型从属性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-Type,我在type属性中得到一个空字符串.

但是,当我使用WinRar在同一台机器上使用默认设置打包ZIP文件时,它会生成一个50 4B 03 04与算法所需的zip字节模式匹配的初始字节数组序列,当我使用上面的代码时,它能够检测到mime键入正确的应用程序/ zip!

因此,正如您从我的解释中看到的那样,这是一个序列化问题,以及算法的"不完美",它将序列化字节与浏览器中的mime扩展相匹配.

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

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

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

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

mimetype.lookup("myfile.rar")
Run Code Online (Sandbox Code Playgroud)

这是一个工作小提琴,升级你的例子使用mimetype js:

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