Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript .rar和.tar缺少Mime类型_Javascript_Jquery_Mime Types - Fatal编程技术网

Javascript .rar和.tar缺少Mime类型

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

Javascript(Windows8.1,Firefox)似乎没有.tar文件或.rar文件的mime类型(也许还有其他文件;这是我发现的唯一两个)。怎么回事?我能用什么来解决这个问题吗?我真的希望能够检索这些文件类型的mime类型,而无需进行一些奇怪的扩展名攻击

我用小提琴来证明这个问题:

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

(下面是JSFIDLE代码)

HTML

谢谢

编辑

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


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")