文件输入为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
发送到我的服务器,而不管浏览器是什么。
接下来有一个问题:如何协调这种行为?
答案 0 :(得分:2)
了解当您在磁盘上存储文件时,mime类型未存储在该类型中非常重要。这就是为什么我们有.jpg
或.wav
等文件扩展名的原因。在通过HTTP的互联网上,我们不需要它们。我们可以有一个网址http://example.com/foo.wav
,但是发送一个JPEG JPEG格式正确的JPEG,浏览器会将其正确呈现为JPEG格式。它并不关心文件扩展名。
但是,如果您在本地文件系统上,则文件扩展名是相关的。如果您打开一个名为foo.wav
的文件,您的操作系统会通过分机.wav
决定打开一些音频播放器。
当选择要将其上传到互联网的文件时,bowser执行一项非常重要的任务:它为文件扩展名选择mime类型。为此,每个浏览器都有一个映射表,将已知的文件扩展名映射到mime类型。嗯,这里有一个问题:这个表在不同的浏览器上显然不相同。这就是为什么你的小提琴会得到不同的结果。
有些浏览器将.wav
映射到audio/wav
,有些浏览器映射到audio/x-wav
。
因此,如果您的测试用例正在下载mime类型audio.wav
的文件,然后使用您发布的小提琴检查其mime类型,则不要检查下载时服务器发送的mime类型该文件,但浏览器只能为文件扩展名猜测mime类型。
在这两种情况下,如果您使用mime类型foo.wav
或audio/wav
发送了文件audio/x-wav
,则磁盘上的文件将是相同的,并且它不会成为稍后可能知道服务器为文件发送的mime类型是什么。
您的浏览器在下载过程中唯一可以做的就是更改文件扩展名。例如,如果您发送文件http://example.com/foo
并且其audio/wav
为mime类型,则浏览器可能会将其重命名为foo.wav
。