【问题标题】:Mime type missing for .rar and .tar.rar 和 .tar 缺少 Mime 类型
【发布时间】:2014-11-26 18:24:52
【问题描述】:

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 添加到 Fiddle

【问题讨论】:

  • 您没有将 jQuery 添加到您的小提琴中。确认不使用 tar 文件。
  • 您使用的是什么操作系统?可能是浏览器委托操作系统来解析 mime 类型,或者浏览器配置中该文件扩展名与其 mime 类型之间没有关联。尝试配置您的浏览器以了解哪个外部程序应该打开 .tar 或 .rar。也许这会有所帮助?
  • 对于 rar 和 tar 没问题,它返回:MacOs/Chrome 上的类型是 application/x-rar(或 x-tar)。你在哪个操作系统/浏览器上测试它?
  • 我添加了一个用 tar cvf whatever.tar file.jpg 创建的 tar 文件,它似乎飞起来了,列出类型为“类型是应用程序/x-tar”和“类型是应用程序/x-rar -compressed” 机智命令 rar awhatever.rar pathe/to/image.jpg。 OSX/铬。我们可以更新操作系统类型、浏览器吗?我已经在单台电脑Chrome、Firefox和Safari上测试成功
  • MacOs/Firefox 相同。

标签: javascript jquery mime-types


【解决方案1】:

JQuery 只是包装了大多数浏览器中使用的底层 File API,因此 JQuery 和 Javascript 处理文件和 mime 类型的方式没有区别。这是文件 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-Type,并且我在 type 属性中得到一个空字符串。

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

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

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

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

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

然后发现 mime 类型只需要一行代码:

mimetype.lookup("myfile.rar")

这是一个有效的 Fiddle,将您的示例升级为使用 mimetype js:

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

【讨论】:

  • 如果不清楚就添加:“mimetype.js”是一个简单的查找表。它根据文件的扩展名工作,并在目录中搜索相应的类型。
  • 太棒了。这正是我一直在寻找的。赏金全是你的(如果我自己这么说,那是当之无愧的)。
  • ...16 小时后(我会将其添加到我的待办事项列表中)
猜你喜欢
  • 2011-10-22
  • 2018-03-07
  • 2012-07-04
  • 2016-12-27
  • 2015-11-01
  • 2018-07-10
  • 1970-01-01
  • 2019-05-06
  • 1970-01-01
相关资源
最近更新 更多