【问题标题】:Why WAV format doesn't have same mimetype in different browsers?为什么 WAV 格式在不同的浏览器中没有相同的 mimetype?
【发布时间】:2017-12-07 01:15:09
【问题描述】:

文件输入为 chrome 或 firefox 中的同一文件提供不同的 Mimetype。我有一个想要上传的 wav 文件,chrome 说它是 audio/wav 和 firefox 检测到 audio/x-wav

我知道这两个 mimetype 非常相似(x- 代表 non-standard),但为什么在这种情况下它们的处理方式不同?

这里有一个小提琴来说明这一点:https://jsfiddle.net/r9ae0zfd/。这是我用于此示例的 WAV 文件:https://freesound.org/people/zagi2/sounds/391828/

最后,我想要的行为是从我的计算机(客户端)获取.wav 文件,并通过 HTTP 将其作为audio/wav 发送到我的服务器,而不管浏览器如何。

对此有一个后续问题:如何协调这种行为?

【问题讨论】:

  • 小提琴使用了你想up加载的文件?
  • 为什么需要这个 mimeType ?浏览器只检查扩展名来设置它,任何带有扩展名.wav 的文件都将其type 设置为其中之一。如果你想检查它是否是一个真正的audio/wav 文件,然后检查它的幻数:52 49 46 46。 (let r = new FileReader(); r.onload = e => console.log(new DataView(r.result).getUint32(0).toString(16) === '52494646'); r.readAsArrayBuffer(file.slice(0,8));})
  • 虽然我知道您编辑的答案(只需将console.log 更改为if 并在我的第一条评论中关闭) 后添加file = new Blob([file], 'audio/wav')),我不这么认为在某人(完全正确)回答了以前版本的问题后编辑您的问题是正确的。
  • @Kaiido 你是对的,我想我还是会接受这个答案。但是这个答案仍然存在误解(即使没有编辑)。所以恕我直言,澄清是强制性的。无论如何,他对您的澄清 cmets 的回答都是我想要的,所以谢谢!
  • ps:我有一个错字:file = new Blob([file], {type:'audio/wav'})

标签: javascript google-chrome firefox mime-types wav


【解决方案1】:

重要的是要了解,当您将文件存储在磁盘上时,mime 类型不存储在该类型中。这就是为什么我们有像.jpg.wav 这样的文件扩展名。在通过 HTTP 的互联网中,我们不需要它们。我们可以有一个 URL http://example.com/foo.wav,但发送一个具有正确 JPEG mime 类型的 JPEG,浏览器会正确地将其呈现为 JPEG。它不关心文件扩展名。

但是,如果您在本地文件系统上,则文件扩展名是相关的。如果您打开一个名为foo.wav 的文件,您的操作系统会根据扩展名.wav 决定打开一些音频播放器。

选择要将其上载到Internet的文件时,Bowser执行非琐碎的任务:它为文件扩展名选择MIME类型。为此,每个浏览器都有一个映射表,将已知的文件扩展名映射到 mime 类型。好吧,这里有一个问题:这个表在不同的浏览器上显然是不一样的。所以这就是为什么你会在你的小提琴中得到不同的结果。

有些浏览器将.wav 映射到audio/wav,有些则映射到audio/x-wav


因此,如果您的测试用例正在下载一个 mime 类型为 audio.wav 的文件,然后使用您发布的小提琴检查其 mime 类型,那么您在下载文件时不会检查服务器发送的 mime 类型,而是您的浏览器只会猜测文件扩展名的 MIME 类型。

在这两种情况下,如果您发送的文件 foo.wav 的 mime 类型为 audio/wavaudio/x-wav,则磁盘上的文件将是相同的,并且以后无法知道 mime 是什么键入您为该文件发送的服务器。

您的浏览器在下载过程中唯一能做的就是更改文件扩展名。例如,如果您发送了一个文件 http://example.com/foo 并且它具有 audio/wav 作为 MIME 类型,则浏览器可能会将其重命名为 foo.wav

【讨论】:

  • 这很有趣,谢谢!虽然我不是从我的服务器下载文件到客户端,而是从客户端上传到我的服务器。我将尝试编辑我的问题以使其更清楚。基本上,我的计算机(客户端)上有一个.wav,无论浏览器如何,我都想将其作为audio/wav 发送到我的服务器。有没有办法做到这一点?
  • 还有一个链接,您可以在其中获取有关此浏览器映射差异的信息吗?
  • 好吧,如果您只是上传案例就简单多了,但答案仍然存在。浏览器将.wav 映射到mime 类型,显然不同的浏览器以不同的方式映射它。这就是为什么它们没有相同的 mime 类型。不过这没关系。您的错误是您期望同一个文件具有相同的 mime 类型,但是没有理由期望这一点。所以我没有消息来源,因为问题是错误的。你问他们为什么发送不同的 mime 类型,但没有理由应该是相同的!
猜你喜欢
  • 2011-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 2021-11-22
相关资源
最近更新 更多