Javascript .rar和.tar缺少Mime类型
Javascript(Windows8.1,Firefox)似乎没有.tar文件或.rar文件的mime类型(也许还有其他文件;这是我发现的唯一两个)。怎么回事?我能用什么来解决这个问题吗?我真的希望能够检索这些文件类型的mime类型,而无需进行一些奇怪的扩展名攻击 我用小提琴来证明这个问题: 如果浏览到.txt或.docx或其他许多格式,则会成功提取该类型。然而,.tar和.rar都不会拉它们。奇怪吧 (下面是JSFIDLE代码) HTML 谢谢 编辑 1) 更新了问题,以反映已在Windows 8.1 Firefox上观察到该问题。Chrome有tar文件的mime类型,但没有rar文件Javascript .rar和.tar缺少Mime类型,javascript,jquery,mime-types,Javascript,Jquery,Mime Types,Javascript(Windows8.1,Firefox)似乎没有.tar文件或.rar文件的mime类型(也许还有其他文件;这是我发现的唯一两个)。怎么回事?我能用什么来解决这个问题吗?我真的希望能够检索这些文件类型的mime类型,而无需进行一些奇怪的扩展名攻击 我用小提琴来证明这个问题: 如果浏览到.txt或.docx或其他许多格式,则会成功提取该类型。然而,.tar和.rar都不会拉它们。奇怪吧 (下面是JSFIDLE代码) HTML 谢谢 编辑 1) 更新了问题,以反映已在Window
2) 将jQuery添加到Fiddle中jQuery只是包装了大多数浏览器中使用的底层文件API,因此jQuery和Javascript处理文件和mime类型的方式没有区别。以下是文件API规范: 您正在操作的
文件
对象继承Blob
对象的类型属性,浏览器使用Blob(字节数组)确定mime类型
为了完成这个任务,每个浏览器都实现了一个文件嗅探算法,从字节数组中“读取”mime类型,如果mime类型不匹配,它将返回一个空字符串,就像上面的场景一样
以下是完整的算法规范:
所以,现在您想知道为什么它不适用于TAR、ZIP和RAR文件,为什么它适用于某些人而不适用于您?。。因为文件嗅探算法显然并不完美
它使用字节模式匹配,这似乎不够可靠
例如,我在windows 8设备上使用WinRaR压缩文件,创建文件的初始字节为:
52617221a0700
然而,浏览器字节模式匹配算法希望将其识别为.RAR
526172201A0700
正如您所看到的,有一点不同,当我使用上面的代码将我的RAR文件上传到浏览器时,Firefox无法识别Mime类型,并且我在Type属性中得到了一个空字符串
但是,当我使用WinRar在同一台机器上以默认设置打包ZIP文件时,它会生成一个初始字节数组序列50 4B 03 04
,该序列与算法预期的ZIP字节模式相匹配,并且当我使用上面的代码时,它能够正确地检测mime类型,即应用程序/ZIP
从我的解释中您可以看到,这是一个序列化问题,以及在浏览器中将序列化字节与mime扩展匹配的算法的“缺陷”
基于上面提到的一切,我建议不要依赖mime嗅探,而是使用自定义代码来确定mime类型或现有库。您可以使用服务器端或客户端方法
如果您想坚持使用客户端,可以使用以下JS库:
然后发现mime类型只需要一行代码:
mimetype.lookup("myfile.rar")
下面是一个实用的提琴,它将您的示例升级为使用mimetype js:
您没有将jQuery添加到小提琴中。已确认不使用tar文件。您使用的是什么操作系统?可能是浏览器正在委托操作系统来解析mime类型,或者浏览器配置中该文件扩展名与其mime类型之间没有关联。正在尝试配置浏览器以了解哪个外部程序应打开.tar或.rar。也许这会有所帮助?对于rar和tar来说没关系,它返回:在MacOs/Chrome上,类型是application/x-rar(或x-tar)。你在哪个操作系统/浏览器上测试它?我添加了一个用tar cvf whatever.tar file.jpg创建的tar文件,它看起来像飞了一样,用命令rar a whatever.rar pathe/to/image.jpg将类型列为“type is application/x-tar”和“type is application/x-rar-compressed”。OSX/铬。我们可以获得操作系统类型、浏览器的更新吗?我已经在MacOs/Firefox上的Chrome、Firefox和SafariName单台计算机上成功地进行了测试。它基于文件的扩展名工作,并在目录中搜索相应的.Fantastic类型。这正是我想要的。这笔赏金全是你的(如果我自己这么说的话,这是当之无愧的)…在16小时内(我会把它添加到我的待办事项列表中)
$('#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"
}
});
mimetype.lookup("myfile.rar")