【问题标题】:Why is there a mime type inconsistency with firefox, chrome?为什么与 firefox、chrome 存在 mime 类型不一致?
【发布时间】:2010-02-06 22:23:43
【问题描述】:

起初我很困惑为什么我的文件没有为某些用户上传,我发现是每个人都没有使用我正在测试的浏览器 chrome。

基本上我正在检查文件以确保他们只能上传 mp3。

这适用于 chrome,但不适用于 firefox。

if ($_FILES['uploaded']['type']=="audio/mp3")

这适用于 Firefox,但不适用于 chrome。

$_FILES['uploaded']['type']=="audio/mpeg"

谁能解释为什么会这样?我认为这两种浏览器都可以理解,或者...是否还有其他浏览器我可能需要担心这些敏感的 mime 类型?

编辑:如果 Pekka 的建议属实,那么检查某种 mime 类型的最佳方法是什么?

【问题讨论】:

  • 重新编辑:检查我编辑的答案。
  • Tek,您确定“这适用于 chrome,但不适用于 firefox.audio/mp3”?因为在当前的浏览器版本中,我看到了相反的情况——音频/mp3 可以在 Firefox 上运行,但不能在 Chrome 上运行。

标签: php


【解决方案1】:

根据w3schoolsaudio/mpeg 是正确的类型。但没关系,MIME 类型可以变化,检查文件时绝对不能依赖它们。不一致是规则,也是意料之中的。

要识别 MP3 文件,也许getid3 包可以帮助您:

getID3() 是一个 PHP 脚本,可从 MP3 和其他多媒体文件格式中提取有用信息。

编辑: IANA 有一个官方的 MIME 类型列表here。那里没有提到 mp3,所以这是 Chrome 的错误行为。

编辑 2: 在服务器端确定文件的 MIME 类型的最佳选择是 finfo 扩展名。它试图通过“内容嗅探”来确定文件的类型,在数据的前几个字节中寻找某些文件类型的特定特征。在这个过程中,MIME 类型也可以变化,但至少它们在同一台服务器上是一致的,这样您就不会再遇到浏览器问题了。

【讨论】:

  • 就像 Pekka 指出的那样,fileinfo 扩展名是测试 mime 类型的唯一合理方法。我只想指出,您根本不能真正信任 files 数组类型。它来自客户端,修改起来很简单。这不是万无一失的,但比浏览器发送的要好得多。
【解决方案2】:

每个浏览器实现 W3c 标准的方式可能略有不同,这让所有开发人员非常懊恼 (#rant)...

依赖用户/浏览器生成的元信息非常不可靠,不推荐使用。如果这是您唯一的安全/健全机制,那么希望对您的系统造成损害的人可以手动输入元类型字段并通过自定义请求 == "audio/mpeg" 然后上传任何类型的可执行文件。如果您真的想确保在将数据上传到永久存储/生产系统之前必须全面检查服务器端的数据。或者在不那么险恶的情况下.. 使用您之前未测试过的不同浏览器的用户可能想要上传合法的 mp3 文件,但它可能不会将其 mime 类型宣布为音频/mpeg 或音频/mp3,然后您会拒绝他们访问到系统...

【讨论】:

    【解决方案3】:

    音频标签

    <audio controls="controls" autoplay="true">
                            <source id="webm" src="Mash Up 2011 19 songs in 1 DJ Got Us Falling In Love Mandu DeeJay Remix.ogg" type="audio/ogg" />
                            <source id="webm" src="Mash Up 2011 19 songs in 1 DJ Got Us Falling In Love Mandu DeeJay Remix.mp3" type="audio/mp3" />
                            <source id="webm" src="Mash Up 2011 19 songs in 1 DJ Got Us Falling In Love Mandu DeeJay Remix.webm" type="audio/webm" />
                            <!--[if lt IE 9]>
                            <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="150" height="38" id="niftyPlayer1" align="right">
                            <param name=movie value="niftyplayer.swf?file=Mash Up 2011 19 songs in 1 DJ Got Us Falling In Love Mandu DeeJay Remix.mp3&as=1">
                            <param name=quality value=high>
                            <param name=bgcolor value=#471313>
                            <embed src="niftyplayer.swf?file=Mash Up 2011 19 songs in 1 DJ Got Us Falling In Love Mandu DeeJay Remix.mp3&as=1" quality=high bgcolor=#471313 width="150" height="38" name="niftyPlayer1" align="right" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer">
                            </embed>
                            </object>
                            <!--<![endif]-->
                        </audio>
    

    视频标签

    <video width="400" height="300" controls="controls" poster="img/poster.png"  >
                <source id="3gp" src="wedding1.3gp" type="video/3gp" />
                <source id="mp4" src="perfectparties/weddingDroid.mp4" type="video/mp4" />
                <source id="webm" src="wedding1.webm" type="video/webm" />
                <source id="mp4" src="perfectparties/wedding1.mp4" type="video/mp4" />
                <source id="ogv" src="perfectparties/wedding1.ogv" type="video/ogv" />
                
                <!--[if lt IE 9]>
                <object id="FlashID" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="400" height="300">
                  <param name="autoplay" value="false">
                  <param name="movie" value="wedding1.swf">
                  <param name="quality" value="high">
                  <param name="wmode" value="opaque">
                  <param name="swfversion" value="6.0.65.0">
                  <param name="expressinstall" value="Scripts/expressInstall.swf">
                  </object>
                  <!--<![endif]-->
    </video>
    
    
    <script type="text/javascript">
    swfobject.registerObject("FlashID");
    </script>
    

    它需要处理所有格式...

    最重要的是确保您的系统管理员已允许在服务器/根/域上使用 MIME 类型。这是最大的不一致性,但它适用于包括 IE 在内的所有浏览器。

    【讨论】:

    • 问题是关于文件上传,而不是媒体元素。
    猜你喜欢
    • 2021-05-31
    • 2011-06-15
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 2023-03-14
    • 2017-10-17
    • 2011-04-19
    相关资源
    最近更新 更多